zoukankan      html  css  js  c++  java
  • GO 数组

    一、数组(Array)

    1.1 什么是数组

    Go 语言提供了数组类型的数据结构。
    数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。

    数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。数组的下标取值范围是从0开始,到长度减1。

    数组一旦定义后,大小不能更改。

    1.2 数组的语法

    声明和初始化数组

    需要指明数组的大小和存储的数据类型。

    var variable_name [SIZE] variable_type
    

    示例代码:

    var balance [10] float32
    var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
    

    初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
    如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:

    var balance = []float32{1000.0, 2.0, 3.4, 7.0, 50.0}
    
    balance[4] = 50.0
    

    数组的其他创建方式:

      var a [4] float32 // 等价于:var arr2 = [4]float32{}
      fmt.Println(a) // [0 0 0 0]
      var b = [5] string{"ruby", "王二狗", "rose"}
      fmt.Println(b) // [ruby 王二狗 rose  ]
      var c = [5] int{'A', 'B', 'C', 'D', 'E'} // byte
      fmt.Println(c) // [65 66 67 68 69]
      d := [...] int{1,2,3,4,5}// 根据元素的个数,设置数组的大小
      fmt.Println(d)//[1 2 3 4 5]
      e := [5] int{4: 100} // [0 0 0 0 100]
      fmt.Println(e)
      f := [...] int{0: 1, 4: 1, 9: 1} // [1 0 0 0 1 0 0 0 0 1]
      fmt.Println(f)
    

    访问数组元素

    float32 salary = balance[9]
    

    示例代码:

    package main
     
    import "fmt"
     
    func main() {
       var n [10]int /* n 是一个长度为 10 的数组 */
       var i,j int
     
       /* 为数组 n 初始化元素 */         
       for i = 0; i < 10; i++ {
          n[i] = i + 100 /* 设置元素为 i + 100 */
       }
     
       /* 输出每个数组元素的值 */
       for j = 0; j < 10; j++ {
          fmt.Printf("Element[%d] = %d
    ", j, n[j] )
       }
    }
    

    运行结果:

    Element[0] = 100
    Element[1] = 101
    Element[2] = 102
    Element[3] = 103
    Element[4] = 104
    Element[5] = 105
    Element[6] = 106
    Element[7] = 107
    Element[8] = 108
    Element[9] = 109
    

    数组的长度

    通过将数组作为参数传递给len函数,可以获得数组的长度。

    示例代码:

    package main
     
    import "fmt"
     
    func main() {  
        a := [...]float64{67.7, 89.8, 21, 78}
        fmt.Println("length of a is",len(a))
     
    }
    

    运行结果:

    length of a is 4
    

    您甚至可以忽略声明中数组的长度并将其替换为…让编译器为你找到长度。这是在下面的程序中完成的。

    示例代码:

    package main
     
    import (  
        "fmt"
    )
     
    func main() {  
        a := [...]int{12, 78, 50} // ... makes the compiler determine the length
        fmt.Println(a)
    }
    

    遍历数组:

    package main
     
    import "fmt"
     
    func main() {  
        a := [...]float64{67.7, 89.8, 21, 78}
        for i := 0; i < len(a); i++ { //looping from 0 to the length of the array
            fmt.Printf("%d th element of a is %.2f
    ", i, a[i])
        }
    }
    

    使用range遍历数组:

    package main
     
    import "fmt"
     
    func main() {  
        a := [...]float64{67.7, 89.8, 21, 78}
        sum := float64(0)
        for i, v := range a {//range returns both the index and value
            fmt.Printf("%d the element of a is %.2f
    ", i, v)
            sum += v
        }
        fmt.Println("
    sum of all elements of a",sum)
    }
    

    如果您只需要值并希望忽略索引,那么可以通过使用_ blank标识符替换索引来实现这一点。

    for _, v := range a { //ignores index  
    }
    

    1.3 多维数组

    Go 语言支持多维数组,以下为常用的多维数组声明语法方式:

    var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
    
    var threedim [5][10][4]int
    

    三维数组

    a = [3][4]int{  
     {0, 1, 2, 3} ,   /*  第一行索引为 0 */
     {4, 5, 6, 7} ,   /*  第二行索引为 1 */
     {8, 9, 10, 11}   /*  第三行索引为 2 */
    }
    
    int val = a[2][3]
    

    1.4 数组是值类型

    数组是值类型
    Go中的数组是值类型,而不是引用类型。这意味着当它们被分配给一个新变量时,将把原始数组的副本分配给新变量。如果对新变量进行了更改,则不会在原始数组中反映。

    package main
     
    import "fmt"
     
    func main() {  
        a := [...]string{"USA", "China", "India", "Germany", "France"}
        b := a // a copy of a is assigned to b
        b[0] = "Singapore"
        fmt.Println("a is ", a)
        fmt.Println("b is ", b) 
    }
    

    运行结果:

    a is [USA China India Germany France]  
    b is [Singapore China India Germany France] 
    

    数组的大小是类型的一部分。因此[5]int和[25]int是不同的类型。因此,数组不能被调整大小。不要担心这个限制,因为切片的存在是为了解决这个问题。

    package main
     
    func main() {  
        a := [3]int{5, 78, 8}
        var b [5]int
        b = a //not possible since [3]int and [5]int are distinct types
    }
    
  • 相关阅读:
    linux下使用hash_map及STL总结
    编写Linux系统下Daemon程序的方法步骤
    c语言版网络爬虫spiderq
    利用unordered_map代替hash_map My Study
    Mike Wallace of '60 Minutes' to retire
    让Redis使用TCMalloc,实现高性能NOSql服务器
    守护进程的单实例实现_非宁静无以致远_百度空间
    sscanf,sscanf_s及其相关用法 小 楼 一 夜 听 春 雨 博客园
    实现个hash_map容器类玩玩 苍梧 博客园
    [Linux初级]Linux下动态库的生成及链接方法
  • 原文地址:https://www.cnblogs.com/puqunzhu/p/11700728.html
Copyright © 2011-2022 走看看