Go学习笔记之:数组

  • 数组是一个具有相同数据类型的元素组成的固定长度有序集合

  • 在Go语言中,数组是值类型,长度是类型的组成部分,也就是说"[10]int"和“[20]int”是完全不同的两种数组类型。

  • 同类型的两个数组支持"=="和"!="比较,但是不能比较大小。

  • 数组作为参数时,函数内部不改变数组内部的值,除非是传入数组的指针。

  • 数组的指针:*[3]int

  • 指针数组:[2]*int


示例1:

package main

import "fmt"

func main() {

    // 这里我们创建了一个具有5个元素的整型数组
    // 元素的数据类型和数组长度都是数组的一部分
    // 默认情况下,数组元素都是零值
    // 对于整数,零值就是0
    var a [5]int
    fmt.Println("emp:", a)

    // 我们可以使用索引来设置数组元素的值,就像这样
    // "array[index] = value"  或者使用索引来获取元素值,
    // 就像这样"array[index]"
    a[4] = 100
    fmt.Println("set:", a)
    fmt.Println("get:", a[4])

    // 内置的len函数返回数组的长度
    fmt.Println("len:", len(a))

    // 这种方法可以同时定义和初始化一个数组
    b := [5]int{1, 2, 3, 4, 5}
    fmt.Println("dcl:", b)

    // 数组都是一维的,但是你可以把数组的元素定义为一个数组
    // 来获取多维数组结构
    var twoD [2][3]int
    for i := 0; i < 2; i++ {
        for j := 0; j < 3; j++ {
            twoD[i][j] = i + j
        }
    }
    fmt.Println("2d: ", twoD)
}

输出结果为

emp: [0 0 0 0 0]
set: [0 0 0 0 100]
get: 100
len: 5
dcl: [1 2 3 4 5]
2d:  [[0 1 2] [1 2 3]]

拥有固定长度是数组的一个特点,但是这个特点有时候会带来很多不便,尤其在一个集合元素个数不固定的情况下。这个时候我们更多地使用切片


示例2:

可以用new创建数组,并返回数组的指针

package main

import "fmt"

func main() {
    var a = new([5]int)
    test(a)
    fmt.Println(a, len(a))
}

func test(a *[5]int) {
    a[1] = 5
}

输出结果

&[0 5 0 0 0] 5


示例3:

package main

import "fmt"

func main() {
    a := [...]User{
        {0, "User0"},
        {8, "User8"},
    }
    b := [...]*User{
        {0, "User0"},
        {8, "User8"},
    }
    fmt.Println(a, len(a))
    fmt.Println(b, len(b))

}

type User struct {
    Id   int
    Name string
}

输出结果

[{0 User0} {8 User8}] 2
[0x1f216130 0x1f216140] 2


示例4(练习):

package main
 
import (
        "fmt"
)
 
func main() {
 
        var arr_1 [10]int
        var sum int
 
        fmt.Println("\nlen(arr_1): ", len(arr_1))
        fmt.Println("initial value of arr_1:")
        for _, elem := range arr_1 {
                fmt.Print(elem, " ")
        }
        fmt.Println("\ninitial value of sum: ", sum, "\n")
 
        fmt.Println("arr_1:")
        for i := 0; i < len(arr_1); i++ {
                arr_1[i] = len(arr_1) - 1 - i
                fmt.Println(arr_1[i])
        }
 
        fmt.Println("\neach set of range arr_1:\nidx val\n-------")
        for idx, val := range arr_1 {
                fmt.Println(idx, val)
        }
 
        for _, elem := range arr_1 {
                sum += elem
        }
 
        fmt.Print("\nsum of arr_1: ", sum, "\n\n")
 
        // define array with length unknown, must initialize when defining
        var arr_2 = [...]string{
                "Sun",
                "Air",
                "Water"}
        fmt.Println("arr_2:")
        for _, elem := range arr_2 {
                fmt.Println(elem)
        }
 
        fmt.Println()
}

输出结果

len(arr_1):  10
initial value of arr_1:
0 0 0 0 0 0 0 0 0 0 
initial value of sum:  0 

arr_1:
9
8
7
6
5
4
3
2
1
0

each set of range arr_1:
idx val
-------
0 9
1 8
2 7
3 6
4 5
5 4
6 3
7 2
8 1
9 0

sum of arr_1: 45

arr_2:
Sun
Air
Water


本文来自:开源中国博客

感谢作者:Goopand

查看原文:Go学习笔记之:数组

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。