1.GOPATH、GOBIN、GOROOT
分别是存储源代码的工作目录;存储可执行代码;存储下载的go环境。
2.关于变量类型
1.var a int
go里的变量类型和变量名字是反过来的,这一点和cpp这些的区别
2.var a=100
这种会自动做类型推断
3.a:=100
这种是更简洁的短变量声明
3.变量名
短变量声明的变量可以在同一个作用域内重新声明,而其他类型的不可以。
其他类型的重名变量如果作用域有嵌套关系,会有屏蔽的效果,而屏蔽是不管这些是什么类型的。
4.管道
一般是用共享内存的方式通信,而管道是用通信的方式实现共享内存。
管道让我想到c里的pipe,可以给一个大小为2的数组一边是读端一边是写端来实现多进程通信。
管道分成缓冲管道和非缓冲管道,根据管道初始化的时候的大小。
大小为0的管道会把异步的通信变成同步的通信,会阻塞在那里。
关于单向管道:可以有单向发送和接收的管道,用处主要是函数调用和返回的时候可以只设置读和只允许对方写来限制操作。
5.函数
5.1函数别名
go里的函数是可以作为变量类型和赋值的,而在c里是用函数指针做赋值。
type a func(s string)
这个a类型就是函数类型,这里函数的签名就是根据函数的参数类型和数量和顺序,以及返回值的类型和数目决定。这个函数别名和函数定义的时候有一些不同,就是函数定义,a和func是反过来的。
5.2高阶函数
指参数或者返回值是函数的函数。高阶函数可以和闭包结合起来。
所谓的闭包就是函数使用的是不属于参数、内部、返回值的外部变量。
6.结构体
6.1定义
type Animal struct{
...
}
结构体可以嵌套其他类型,嵌套类型不需要名字。可以直接通过.访问。
6.2方法
方法和函数的不同是方法是有接收者
func (a Animal)String()string{}
这里代表这个方法属于Animal,这里就有一点像cpp的::。
定义了同名内容包括方法或者变量的层次嵌套的结构体,会出现的屏蔽的现象。
关于结构体和方法:这个和接口绑在一起用有很多用处,我学5840第一个就想到这个。
7.接口
7.1定义
type b interface{
...
}
与结构体的区别是接口内部都是方法,没有func,接口的方法比函数的签名更严格,方法名字也属于一部分来判断。
7.2接口的功能
实现了接口的所有方法的数据类型,就是接口的实例化,任何使用接口的部分可以用来替代。
7.3接口的nil
接口内部会有动态类型字段,只有未初始化和用nil初始化才会是nil。
接口的静态类型就是接口的类型,这个和多态的动态绑定有相像的地方。
7.4接口的嵌套
接口是不会有屏蔽现象的,只有冲突,于是不能使用相同的名字,接口的嵌套是被鼓励的,组合使用不同的接口看起来也会容易。
关于接口:接口不能被直接实例化,只有实现了接口方法的数据类型实例化的时候才是接口可以初始化的内容。