首页 > 代码库 > go学习笔记2
go学习笔记2
默认自动初始化:
Go引入了零值的概念,即每个对象被创建的时候,默认初始化为它相应类型的零
值。例如,string为””,指针为nil,int为0等等,这样就保证了变量在使用时,不会因为忘
记初始化而出现一些莫名其妙的问题
OOP在Go中是通过组合而非继承来实现的,因为“继承”存在一些弊端,比如
:“不适应变化”,“会继承到不适用的功能”。所以在编码实践中一般建议优先使用组合而
非继承。在Go中则更进一步,直接去掉了继承,只支持组合。在定义struct时,采用匿名
组合的方式,也更好地实现了C++中的“实现”继承,而在定义interface时,也可以实现接
口继承
Go对并发的支持,采用的是CSP模型,即在代码编写的时候遵循“通过通信来共
享内存,而非通过共享内存来通信”的原则
func goroutine(pass chan bool) {
fmt.Println("hello, i‘m in the goroutine")
pass <- true
}
func main() {
pass := make(chan bool)
go goroutine(pass)
<-pass
fmt.Println("passed")
}
Go的interface与Java等的interface相比优势在于:
1. 按需定义,最小化重构的代价。
2. 先实现后抽象,搭配结构嵌入,在编写大型软件的时候,我们的模块可
以组织得耦合度更低。
new与变量初始化
在Go中,new与delete和在C++中的含义是不一样的。delete用以删除一个
map项,而new用以获得一个指向某种类型对象的指针,而因为Go支持类似如下的语法
:
type T struct {
…
}
obj := &T{} . obj = new(T)
同时Go提供另一个关键字make用以创建内建的对象,所以&T{}这种语法与
make合起来,就基本可以替代new(但目前new(int)这类基本类型指针的创建,则无法用
&T{}的写法),因此new看起来有点冗余了,这与Go的简单原则有点不一致。
For…range不能用于自定义类型
为了遍历的方便,Go提供了for-range语法,但是这种构造只能用于built-in类型,
如slice、map和chan;而对于非built-in类型,即使官方包container中的相关数据结构也
不行,这降低了for-range的易用性。而目前在不支持泛型的前提下,要实现一个很友好的
for-range看起来还是很不容易的。
这个果然蛋疼,怪不得我不能用range遍历list了。。。
以上来自《go语言评估报告》
@一个切片的长度永远不能超出它的容量。---?不是相当于vector可以动态增长的吗???
a := [...]int{1,2,3,4,5} // The ... means "whatever length the initializer has"
len(a) //=> 5
/* Slice from the middle */
s := a[2:4] //=> [3 4]
len(s), cap(s) //=> 2, 3
/* Grow the slice */
s = s[0:3] //=> [3 4 5]
len(s), cap(s) //=> 3, 3
/* Cannot grow it past its capacity */
s = s[0:4] // this is a compile error
Go有两种方式直接创建切片而不用引用底层存
储:
/* literal */
s1 := []int{1,2,3,4,5}
/* empty (all zero values) */
s2 := make([]int, 10) // cap(s2) == len(s2) == 10
Go语言不支持继承,至少与大多数语言的继承不一样。并不存在类型的层次结构。相较于继承,Go鼓励使用组合和委派,并为此提供了相应
的语法甜点使其更容易接受
channel的阻塞行为并非永远是最佳的。该语言提供了两种对其进行定制的方式:
1. 程序员可以指定缓冲大小——想缓冲的channel发送消息不会阻塞,除非缓冲已满,同样从缓冲的channel读取也不会阻塞,除非缓
冲是空的。
2. 该语言同时还提供了不会被阻塞的发送和接收的能力,而操作成功是仍然要报告。
/* Create a channel with buffer size 5 */
ch := make(chan int, 5)
/* Send without blocking, ok will be true if value was buffered */
ok := ch <- 42
/* Read without blocking, ok will be true if a value was read */
val, ok := <-ch
《go初级读本》