Go坑,真是名副其实的入坑。
以下是一个新手在Go学习的入坑经历,与大家分享、共勉!!!
-
slice
- var xs []string 声明变量后,可以直接使用xs[0] = "a"赋值吗?
- 接上题, xs = append(xs, "a")可以赋值吗?
- var xs = make([]string,1); xs = append(xs, "a"); 这时xs的里的内容是什么?
- 以下代码返回什么结果
var myS = []string{"a", "b", "c", "d", "e", "f"} newP := append(myS[:3], myS[4:]...) fmt.Print(newP) fmt.Print(myS)
以下是答案 第一题:不能赋值。因为声明后长度为0 第二题:可以赋值。slice会自动增长 第三题:xs中存储了两个元素,索引位为0的,其值是空,索引位为1的,其值是a.所以,如果想初始化一个空切片,应该是make([]string, 0),或者make([]string,0,1); 否则其会为每个索引值,添加默认的零值。本题中string的零值是空字符串,所以在执行append后,切片长度变为2,其第一位空字符串 第四题:newP的值是["a","b","c","e","f"], myS的值为["a","b","c","e","f",“f”]!!!myS修改了,不再是原来的值。这是主要是由于数组重用造成的。newP := append(myS[:3], myS[4:]...)的实际底层操作是,先将myS数组中的索引4和5位置上的值覆盖到原索引3和4的位置上,所以myS被修改为["a","b","c","e","f",“f”],同时返回一个拷贝["a","b","c","e","f"]到newP上。 -
map
- var xs []string声明数组后,可以通过append方法向切片中添加值,那么var mp map[string]string,可以直接调key-value吗?
以下是答案: 第一题:不行。必须使用var mp = make(map[string]string)或者mp := map[string]string{} -
append与copy
在使用append或copy向某一slice添加数据时,前者是追加,后者从索引为0处覆盖。使用append时slice可以只声明,且不指定长度,但是使用copy时一定要使用make创建实例。如下
var myslice []string append[myslice, "a", "b"] //可以添加a,b至slice中 copy[myslice, anotherSlice] // myslice中仍为空 使用copy时,必须要 var myslice = make([]string, 5)或var myslice = make([]string, 0, 5).创建实例。