1.数组和切片
如果一个切片是使用一个数组进行初始化的,改变切片或者在切片后增加内容都会导致原数组的变化
这里,其实可以把切片理解为对数组的引用,所以切片元素的增删改,必然会影响数组
http://blog.csdn.net/marcky/article/details/7307985
2.struct
数据可以有匿名数据,这个功能类似于继承,匿名数据不需要变量,直接写类型即可
函数在struct外定义,若修改struct内数据,可以使用指针形式,如果不需要,声明一个即可
http://blog.csdn.net/chuangrain/article/details/9335041
3.make
和new都在堆中分配内存,但是他们却有很大不同
1.new(T)新建了T类型的item,将内存清零,等待使用,而不是初始化内存,并返回地址*T,应用于数组和struct结构体,相当于&T{},
就是它返回了一个指向新分配的类型为T的零值的指针
2.make(T)返回了类型T的初始化值,应用于3种内置的引用类型:slice数组切片,map映射,channel,并返回类型T
(不是*T
)的一个被初始化了的(不是零)实例。
这种差别的出现是由于这三种类型实质上是对在使用前必须进行初始化的数据结构的引用
http://coolshell.cn/articles/8460.html
http://coolshell.cn/articles/8489.html
4.non-declaration statement outside function body
这个错误一般是{}里面定义的时候,需要以下面的形式
Person := Ss{
"luanluan",
"12",
}
或者
Person := Ss{
"luanluan",
"12"}
其他形式均会报上述错
5.go test使用
问题较为复杂:
介绍下背景
ipc这个文件夹下有三个文件:
1.server.go 2.client.go 3.ipc_test.go
如果install server, the following errors show up:
can't load package: package server: cannot find package "server" in any of:
/usr/local/go/src/pkg/server (from $GOROOT)
/home/golang/src/server (from $GOPATH)
/home/golang/test/src/server
/home/golang/learning/src/server
/home/golang/cgss/src/server
结论:属于同一个包的源文件必须全部被一起编译,一个包既是编译时的一个单元,因此根据惯例,每个目录都只包含一个包.
所以,只需 回退到 src目录,运行 go install ipc即可
https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/04.2.md
编译完成之后,如果运行 go test ipc_test.go,会出现如下错误:
# command-line-arguments
ipc/ipc_test.go:15: undefined: NewIpcServer
ipc/ipc_test.go:16: undefined: NewIpcClient
ipc/ipc_test.go:17: undefined: NewIpcClient
FAIL command-line-arguments [build failed]
结论:运行test不能以如上命令,应该在install完ipc这个包之后,运行go test即可
http://stackoverflow.com/questions/14723229/go-test-cant-find-function-in-a-same-package
6.append ...
可以和第一条一起了解
func main() { arr1 := [5]int{1, 2, 3, 4, 5} slice1 := arr1[1:2] slice1 = append(slice1, 6, 7, 8) fmt.Println("slice1:", slice1) fmt.Println("arr1:", arr1) arr2 := [5]int{1, 2, 3, 4, 5} slice2 := arr2[1:3] slice2 = append(slice2, 6, 7, 8) fmt.Println("slice2:", slice2) fmt.Println("arr2:", arr2) }
得到的结果是
slice1: [2 6 7 8] arr1: [1 2 6 7 8] //神奇地,原数组被改变了 slice2: [2 3 6 7 8] arr2: [1 2 3 4 5] //一切正常
原因:
当原slice容量足够,不需要进行扩容时,那对slice元素的追加,都是发生在原slice里的(数组里),所以,原数组被“悄悄”改变了。这也解释了,为什么arr1的状态被改变了的原因。
当append进来的元素个数会导致超出原slice的容量限制时会执行下面步骤:
-
创建一个容量更大的slice(扩容)。与对slice进行切片操作不同,这个slice是全新的,它的数组也是全新的,指针也是指向新数组的首位置。
-
新slice创建好后,会将原来被append的slice的元素内容进行值复制到新的slice。
-
将要被append元素,追加到新slice的末尾。
- 最后,这扩容的情况下,需要将append之后重新赋值给slice2,否则会出现错误,如下所示
func main() { res := []int{0, 1} fmt.Println(res) append(res, 2) fmt.Println(res) // what's the output? }
ps,当想slice中添加元素时,可以直接加入元素,如上述例子所示
若想要添加另外一个slice,则需要如下语法
x := []int{1,2,3} y := []int{4,5,6} x = append(x, y...) fmt.Println(x)
http://sharecore.info/blog/2013/07/23/the-trap-of-go-slice-appending/
7.addcookie
最近想做一个接口测试的工具
考虑到go语言的并发能力,打算使用go入手
但是发现了一个问题,网上资源中大部分都是使用go语言作为server端,而我是打算使用go作为client端
需求如下:通过fiddler截取了一次请求信息
其中包括各种header和cookie
问题:go作为client端向request插入cookie资料较少
知道一个函数AddCookie可以使用,但是具体需要插入的cookie格式,久久找不到解决方案
解决ing
to be continued