编译Golang Project
- 每次创建工程的时候都需要使用设置环境变量GOPATH来控制代码的位置
1
export GOPATH=<path>
可以设置路径
- go build和go install的区别
go build会生成一个输出文件,只能针对包含main函数的文件使用,会自动生成依赖
go install会将二进制文件包都存在固定形式的目录下
方法
结构体的构造函数
Go语言中没有构造函数这种东西,有别于C/C++。但是可以构造一个函数返回结构体指针,统一命名为New。这个称作Factory Method。 结构体的长度
1
size := unsafe.Sizeof(T{})
可以获得名字为T的结构体的长度
强制结构体用Factory Method来初始化
将Struct Name的首字母小写,这样就导致其变为私有的(private),因此在其他包中都必须使用Factory Method来初始化结构体了结构体的标志只能用reflect包内的内容来访问
匿名域和内嵌结构体
这个和传统的OO编程中的继承很类似,可以实现一些继承的功能。
直接使用类型名字来访问匿名域
内嵌结构体可以直接实现继承域的功能结构体的方法
结构体的方法实际上是由函数加上一个接收者来表示这个方法是属于谁的。
结构体的方法和结构体的定义都必须在同一个包里。
通常接收者是一个指针方法的继承
对于多个继承关系的话,直接添加进去就好了
接口
- 接口定义结构
1
2
3
4type Namer interface {
Method1(param_list) return_type
Method2(param_list) return_type ...
}
注意接口的名字是需要加上(e)r的,也就是比如一个接口的功能上我们将其命名为Select,那么接口的名字就要改为Selecter
Go语言中的接口可以实例化,对应着的是一个多字的数据结构指针,未初始化时是一个nil指针
- 接口和实现可以放在不同的包里
- 利用接口实现多态
将一个接口用多个结构体来实现,然后这些结构体中实现同一个接口的,然后实例化一个接口,这个接口可以用前面这些多个结构体赋值,从而实现了多态性和重载
一个例子
在Go的标准库io中,有定义了一个接口Reader1
2
3type Reader interface{
Read(p []byte)(n int, err error)
}
然后一下这些代码都是可行的1
2
3
4
5
6var r io.Reader
r=os.stdin
r=bufio.NewReader(r)
r = new(bytes.Buffer)
f, _ := os.Open(“test.txt”)
r = bufio.NewReader(f)
因为从第二行开始的右边的结构体中都实现了Reader这个接口,里面都有一个Read的函数与Reader中的对应