Go 语言介绍

Google
goatomicsync通过通信来共享内存,而不是通过共享内存来通信chan
classstructstructDuck Type鸭子模型implements
21纪的C语言DockerK8s

发展历程

20072008200920121.020151.520161.61.7yaccGCx8620171.81.9structsyncmap20181.101.11buildgo mod20191.121.13syncpool20201.141.15defermaphashunicode11.0unicode12.0tzdatarefect

设计哲学

少即是多

世界是并行的

组合优于继承

非侵入式接口

少即是多

25;

类型推导:

var name = "zhangsan" // 自动推导变量为 string类型

func show() {
	age := 18 // 自动推导变量为 int类型
}

世界是并行的

go
func fetch(url string) {
  resp, err := http.Get(url)
  if err != nil {
    log.Printf("fetch error %s", err.Error())
  }
  ...
}

// 每个Go程序都会有一个主的 goroutine,称之为g0
func main() {
  // 是用go关键字单独启动一个goroutine, Go的线程并不是系统线程,Go线程与系统线程的并比为m:n,且go线程由的runtime进行调度与管理
  go fetch("https://www.baidu.com") 
  
  select{}
}

组合优于继承

Go 采用组合的方式来实现多个类型的聚合

type Person struct {
  Name string
  Age  int
}

type Student struct {
  Person // 组合Person struct, 拥有Person的字段
  ClassRoom string
  Score 	  float32
}

type Teacher struct {
  Person // 组合 Person struct, 拥有Person的字段
  Salary  float32
}

func main() {
  stu := Student {
    Person: Person {
      Name: "zhangsan",
      Age: 10,
    },
    ClassRoom: "三年级一班",
    Score: 98.2,
  }
  // 直接通过实例拿到组合结构体中定义的字段
  fmt.Println(stu.Name) // out: zhangsan
  
  teacher := Teacher {
    Person: Person{
      Name: "lisi",
      Age: 38,
    }
    Salary: 9000.2,
  }
  
  fmt.Println(teacher.Name) // out: lisi
}

非侵入式接口

Go 中,提倡小接口,组合成大接口

type Jwt interface {
  Gen(data interface{}) (string, error)
}

type jwt struct {
  
}

// jwt结构体实现了Jwt接口,不需要显示指定实现了什么接口
// 只要该结构体中方法包含实现接口中所有的方法即可,方法的签名与接口中定义的方法签名一致
func (j *jwt) Gen(data interface{}) (string, error) {
  // 生成jwt token
  token, err := ...
  if err != nil {
    return "", err
  }
  return token, nil
}

// 在Go中,可以通过实现接口的方式,实现多态的效果
type Reader interface {
  Read(p []byte) (int, error)
}

type ReadFile struct {
  
}

func (r *ReadFile) Read(p []byte) (int, error) {
  // TODO 具体实现
}


type ReadNet struct {
  
}

func (r *ReadNet) Read(p []byte) (int, error) {
  // TODO 具体实现
}


func Processer(r Reader) {
  // TODO 具体实现
}

// use 
func main() {
  readFile := new(ReadFile)
  readNet := new(ReadNet)
  
  // 使用接口实现多态
  Processer(readFile)
  Processer(readNet)
}

在这里插入图片描述