zoukankan      html  css  js  c++  java
  • Go语言学习笔记(四) [array、slice、map]

    日期:2014年7月22日
     
    一、array[数组]
     
    1、定义:array 由 [n]<type> 定义,n 标示 array 的长度,而 <type> 标示希望存储的内容的类型。
        例如:
        var arr[10] int
        arr[0] = 1
        arr[1] = 2
        数组值类型的:将一个数组赋值给 另一个数组,会复制所有的元素。另外,当向函数内传递一个数组的时候,它将获得一个数组的副本,而不是数组的指针。
     
    2、数组的复合声明。a :=[3]int{1,2,3}或简写为a:=[...]int{1,2,3}(Go会自动统计元素个数)
     
    3、多维数组
        例如:a := [2][2]int{ [2]int{1,2}, [2]int{3,4} } 等价于a := [2][2]int{ [...]int{1,2}, [...]int{3,4} }
        在2010-10-27发布版中,当声明的数组的元素类型都一致,那么可以省略内部元素的类型。上面的声明方式可以改写为a := [2][2]int{ {1,2}, {3,4} }
     
    4、数组长度也是类型的一部分,因此具有不同长度的数组,其类型是不同的。
       
    二、slice[切片]
     
    1、slice 与 array 接近,但是在新的元素加入的时候可以增加长度。slice 总是指向底层的一个 array。slice本身不是数组,slice 是一个指向 array的指针,这是其与 array 不同的地方;slice 是引用类型, 这意味着当赋值某个 slice 到另外一个变量,两个引用会指向同一个 array。
     

     2、创建一个slice:sl := make([]<type>,len,cap),cap值可以省略(省略时,值等同于len),len表示存放元素的个数,cap表示容量。容量的大小cap =< real_cap < 2 * cap,当大小超过容量cap时,会容量会自动升级,但是必须说明的是,自动升级后,将会重新分配连续的内存地址。 

     
    3、一个slice可以通过a[i:j]的方式创建,新建的slice将会指向a,从i开始,到(j-1)结束,长度=j-i。
     
    4、slice的append操作。slice可以在尾部追加元素,甚至还可以将一个slice追加到另一个slice的尾部,如果最终的长度没有超过原始的slice,那么append操作将返回原来的slice,否则将重新分配内存地址。
     
    5、slice的copy操作。copy操作返回复制的元素的个数,复制的数量是len(src)和len(dst)中最小的值。
     
    6、slice操作的一些示例
     a := [6] int {1,2,3,4,5,6} //数组下标从0开始
     s1 := a[0:4] //1,2,3,4
     s2 := a[:] //1,2,3,4,5,6,是a[0:len(a)]的简写
     s3 := a[:3] //1,2,3,是a[0:3]的简写
     //s4 := a[1:7] //数组越界,抛出invalid slice index 7 (out of bounds for 6-element array)
     s5 := s2[:] //1,2,3,4,5,6,此时的s5和s2依然指向a,可通过内建函数println(slice)打印出结果对比。
     
     s6 := [] int {1}
     s7 := append(s6,2)
     s8 := append(s7,2,2,3,3)
     //s9 := append(s7,s6...) //注意这后面有三个点,不加上的话会报类型错误。我开始还以为是省略号,纠结了半天。
     
     var ar = [...] int {1,2,3,5,6,7}
     n1 := copy(s10,ar[0:]) //返回结果 n1=6,此时 s10的值为[1 2 3 5 6 7] 
     n2 := copy(s10,s10[2:]) //返回结果 n2=4,此时 s10的值为[3 5 6 7 6 7] 
     
    关于slice容量扩容重新分配内存地址的问题也没有完全弄明白,以后再补充进来吧。
     
    三、map[字典]
     
    1、map在Go语言中是作为一种内建类型存在。一般定义map的方法为:map[<from type>]<to type>
    例如:sexes := map[string]string{
                        "Man":"男",
                        "Male":"女",//后面的逗号必须要写
                  }
    2、声明map:mapName := make(map[type1]type2){}
     
    3、map索引取值,mapName["key"],例如:sexes["Male"]
     
    4、遍历map,可以使用range,例如:
         for _,sex := range sexes {
             fmt.Println(sex)
         }
     
    5、向map中增加元素:mapName["newKey"]=value,例如:sexes["unknow"] = "未知性别"//向map增加元素
     
    6、删除map的元素:delete(mapName,"key"),例如:delete(sexes,"unknow")//删除map中的元素,会删除map中由m[x]建立的实例
     
    7、检查map中是否存在某元素
    例如:
        var val string
        var present bool
        val,present = sexes["nothing"]
     
    也可以直接使用“逗号ok”的形式,例如:v,ok := sexes["Male"]
  • 相关阅读:
    HDU 5585 Numbers
    HDU 3308 LCIS
    POJ 2991 Crane
    POJ 1436 Horizontally Visible Segments
    POJ 3667 Hotel
    HaiHongOJ 1003 God Wang
    【SDOI 2008】 递归数列
    5月19日省中提高组题解
    【HDU 1588】 Gauss Fibonacci
    【POJ 3233】Matrix Power Series
  • 原文地址:https://www.cnblogs.com/javagoboy/p/3862928.html
Copyright © 2011-2022 走看看