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)
}