zoukankan      html  css  js  c++  java
  • Title

    Go的数组

    Array(数组)

    Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化

    var 数组变量名 [元素数量]T
    // 定义一个长度为3元素类型为int的数组a
    var a [3]int
    
    • 数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。 [3]int[5]int是不同的类型

    • 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会panic。

    数组的初始化

    方式一

    初始化数组时可以使用初始化列表来设置数组元素的值

    func main() {
      var Array1 [3]int
      var Array2 = [3]int{1, 2}
      var Array3 = [3]string{"北京", "上海", "广州"}
      fmt.Println(Array1)
      fmt.Println(Array2)
      fmt.Println(Array3)
    }
    //[0 0 0]
    //[1 2 0]
    //[北京 上海 广州]
    

    方式二

    按照上面的方法每次都要确保提供的初始值和数组长度一致,一般情况下我们可以让编译器根据初始值的个数自行推断数组的长度

    func main() {
      var Array1 [3]int
      var Array2 = [...]int{1, 2}
      var Array3 = [...]string{"北京", "上海", "广州"}
      fmt.Println(Array1)
      fmt.Println(Array2)
      fmt.Printf("type of Array2: %T
    ", Array2)
      fmt.Println(Array3)
      fmt.Printf("type of Array3: %T
    ", Array3)
    }
    //[0 0 0]
    //[1 2]
    //type of Array2: [2]int
    //[北京 上海 广州]
    //type of Array3: [3]string
    

    方式三

    使用指定索引值的方式来初始化数组

    func main() {
      a := [...]int{1:1, 3:5}
      fmt.Println(a)
      fmt.Printf("type of a: %T
    ", a)
    }
    //[0 1 0 5]
    //type of a: [4]int
    

    数组的遍历

    func main() {
      a := [...]string{"北京", "上海", "广州"}
      // 方法一:for循环遍历
      for i := 0; i < len(a); i++ {
        fmt.Println(a[i])
      }
      // 方法二:for range遍历
      for index, value := range a {
        fmt.Println(index, value)
      }
    }
    //北京
    //上海
    //广州
    //0 北京
    //1 上海
    //2 广州
    

    多维数组

    二维数组

    func main() {
    	a := [3][2]string{
    		{"北京", "上海"},
    		{"广州", "深圳"},
    		{"成都", "武汉"},
    	}
    	for _, value1 := range a {
    		for _, value2 := range value1 {
    			fmt.Printf("%s  ", value2)
    		}
    		fmt.Println()
    	}
    }
    //北京  上海  
    //广州  深圳  
    //成都  武汉
    

    注意: 多维数组只有第一层可以使用...来让编译器推导数组长度

    //支持的写法
    a := [...][2]string{
    	{"北京", "上海"},
    	{"广州", "深圳"},
    	{"成都", "重庆"},
    }
    

    数组是值类型

    数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值

    func modifyArray(x [3]int) {
    	x[0] = 666
    }
    func modifyArray2(x [3][2]int) {
    	x[2][0] = 777
    }
    func main() {
    	a := [3]int{1, 2, 3}
    	b := [3][2]int{
    		{1, 1},
    		{2, 2},
    		{3, 3},
    	}
    	modifyArray(a) //在modifyArray中修改的是a的副本x
    	fmt.Println(a)
    	modifyArray2(b) //在modifyArray2中修改的是b的副本x
    	fmt.Println(b)
    }
    //[1 2 3]
    //[[1 1] [2 2] [3 3]]
    

    注意

    • 数组是值类型
    • 数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的
    • [n]*T表示指针数组,*[n]T表示数组指针
    //指针数组 数组里面的元素是指针
    [5]*int
    
    //数组指针 这是一个指针
    *[5]int
    
  • 相关阅读:
    洛谷——P1951 收费站_NOI导刊2009提高(2)
    洛谷——P1475 控制公司 Controlling Companies
    洛谷——P1176 路径计数2
    洛谷——P1156 垃圾陷阱
    洛谷——P2734 游戏 A Game
    洛谷——P1767 家族_NOI导刊2010普及(10)
    洛谷——P1413 坚果保龄球
    Kali-linux破解LM Hashes密码
    Kali-linux分析密码
    Kali-linux密码在线破解
  • 原文地址:https://www.cnblogs.com/guotianbao/p/12098046.html
Copyright © 2011-2022 走看看