Go 坑

196 阅读2分钟

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).创建实例。