美文网首页
golang小结 2

golang小结 2

作者: TimeMage | 来源:发表于2018-02-05 11:28 被阅读14次

    array, slice, map

    遍历

        for k,v:=range m { //v可省
            fmt.Println(k,v)
        }
    

    数组

    • 一维数组定义

      var arr1 = [4]int{1, 2, 3}
      var arr2 = [...]int{1, 2, 3}
      fmt.Printf("%T, %v, %d %d\n", arr1, arr1, len(arr1), cap(arr1))
      fmt.Printf("%T, %v, %d %d\n", arr2, arr2, len(arr2), cap(arr2))
      /*
      [4]int, [2 3 4 0], 4 4
      [3]int, [1 2 3], 3 3
      */
      
    • 多维数组定义

      var arr1 = [3][2]int{{1, 2},
          {3, 4},
          {5, 6},
      }
      fmt.Println(arr1, len(arr1), len(arr1[0])
      //[[1 2] [3 4] [5 6]] 3 2
      )
      
    • 注意事项

      • 数组不能更改长度

          //arr1 = append(arr1, 2)
          //arr1 = [5]int{3, 4, 5}
        
      • 数组是值类型,赋值会进行完整拷贝

        func foo(x [3]int, y []int) {
            fmt.Println(&x[0], &y[0])
        }
        func test3() {
            arr1 := [...]int{1, 2, 3}
            fmt.Println(&arr1[0])
            foo(arr1, arr1[:])
        }
        //0xc042008440
        //0xc042008480 0xc042008440
        
      • 程序在运行时会自动对数组进行越界检查

    切片

    • 构造切片

      var s1 []int = []int{1, 2}
      var s2 = make([]int, 10,20)
      var s3 = make([]int, 10)
      // make内置函数,是可重载的特例 make(type, len, cap=len)
      a := [...]int{1, 2, 3, 4, 5}
      var s4 = a[1:3] //切片名称的由来,底层数组相同
      var s5 = append([]int{}, a[1:3]...)//底层数组不同,可变参数的使用
      
    • 切片修改

      //增加
      s2 = append(s2,1)
      s2 = append(s2, s1...)
      //增加有可能会更换底层数组
      //删除
      index:=5
      s2 = append(s2[:index],s2[index+1:])
      //插入
      r = append([]int,s2[index:]...)//必须重新分配个临时空间
      s2 = append(s2[:index],123)
      s2 = append(s2, r...)
      //拷贝 copy(dst,src) 拷贝大小为两者len的最小值
      func testcopy() {
          s1 := []int{1, 2, 3}
          s2 := []int{4, 5}
          copy(s1, s2)
          fmt.Println(s1)
          s1 = []int{7, 8, 9}
          copy(s2, s1)
          fmt.Println(s2)
      }
      /*
      [4 5 3]
      [7 8]
      */
      
    • 注意事项

      • 切片是引用类型。对切片内元素的更改,会对底层数组造成更改,对底层数组的更改,也会造成对切片元素的更改
      • 对于同时使用底层数组,或切片共享底层数组时需特别注意

    字典

    func test1() {
        a := map[string]int{"abc": 1,
            "cda": 2,
        }//构造
        a["haha"] = 4//插入
        delete(a, "abc")//删除
        for k, _ := range a {//_可省
            fmt.Println(k, a[k])
        }
        b := make(map[int]string, 2)// make(type, cap=0) 指定cap应该有所优化
        b[3] = "good"
        fmt.Println(b)
    }
    func test2() {
        for i := 0; i < 5; i++ {
        m := map[int]string{
            0: "a", 1: "a", 2: "a", 3: "a", 4: "a",
            5: "a", 6: "a", 7: "a", 8: "a", 9: "a",
        }
        fmt.Println(m)//map[int] 的实现方式不一定是有序的,每次遍历的结果可能不一样
        for k := range m {
            m[k+k] = "x"//插入或修改
            delete(m, k)
        }
        fmt.Println(m)
        }
    }
    /*
    cda 2
    haha 4
    map[3:good]
    map[1:a 3:a 5:a 9:a 0:a 2:a 4:a 6:a 7:a 8:a]
    map[8:x 18:x 48:x 14:x 2:x 6:x 10:x 32:x]
    map[0:a 5:a 6:a 7:a 9:a 1:a 2:a 3:a 4:a 8:a]
    map[18:x 24:x 4:x 20:x 16:x 6:x 28:x]
    map[1:a 2:a 4:a 6:a 0:a 5:a 7:a 8:a 9:a 3:a]
    map[10:x 18:x 28:x 6:x 2:x 16:x 24:x]
    map[0:a 2:a 5:a 8:a 1:a 3:a 4:a 6:a 7:a 9:a]
    map[6:x 14:x 2:x 8:x 12:x 20:x 18:x 32:x]
    map[8:a 9:a 0:a 3:a 6:a 5:a 7:a 1:a 2:a 4:a]
    map[18:x 12:x 10:x 14:x 2:x 16:x]
    */
    

    相关文章

      网友评论

          本文标题:golang小结 2

          本文链接:https://www.haomeiwen.com/subject/rypbzxtx.html