首页 > 代码库 > 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初级读本》