Fork me on GitHub

Go语言之数组

一、数组简介

数组是一种可以存放多个同一类型数据的数据类型,在Go中,数组是值类型。

  • 数组定义

var 数组名 [数组大小]数据类型

如:var a [5]int

  • 内存布局
package main

import "fmt"

func main() {

    var intArr [3]int
    fmt.Println("intArr=", intArr)
}
/*
intArr= [0 0 0]
*/

对于上面的代码中,定义一个整型的、长度为3的数组,默认的数组值为0。

 可以通过赋值进行初始化,改变默认值。

其中,数组的地址可以通过数组名称来获取 &intArr;数组的第一个元素的地址就是数组的地址;数组的各个元素的地址间隔一句数组的类型决定,比如 int64对应的数组元素地址间隔是8。

二、数组使用

(一)基本使用

1、数组初始化

package main

import "fmt"

func main() {

    // 数组初始化
    // 方式一
    var numArr1 [5]int = [5]int{1,2,3,4,5}
    // 方式二
    var numArr2 = [5]int{1,2,3,4,5}
    // 方式三
    var numArr3 = [...]int{1,2,3,4,5}
    // 方式四
    var numArr4 = [...]int{1:2, 0:1, 2:3, 3:4, 4:5}
    
    // 方式五 类型推导
    numArr5 := [...]string{"zhangsan", "lisi", "wangwu"}
    fmt.Println("numArr1", numArr1)
    fmt.Println("numArr2", numArr2)
    fmt.Println("numArr3", numArr3)
    fmt.Println("numArr4", numArr4)
    fmt.Println("numArr5", numArr5)

}

/*
numArr1 [1 2 3 4 5]
numArr2 [1 2 3 4 5]
numArr3 [1 2 3 4 5]
numArr4 [1 2 3 4 5]
numArr5 [zhangsan lisi wangwu]
*/

2、访问数组

package main

import "fmt"

func main() {

    var intArr [3]int = [3]int{4, 5, 6}

    fmt.Println("第三个元素", intArr[2]) // 第三个元素 3

    for i := 0; i < len(intArr); i++ {
        fmt.Printf("第%d个元素=%d \n", i, intArr[i])
    }
    
}
/* 通过intArr[索引值]取值
第0个元素=4 第1个元素=5 第2个元素=6
*/

(二)for-range

package main

import "fmt"

func main() {

    var intArr [3]int = [3]int{4, 5, 6}

    for i, v := range intArr {
        fmt.Printf("i=%v, v=%v \n", i, v)
    }
    
}
/*
i=0, v=4 
i=1, v=5 
i=2, v=6
*/
  • i 数组的下标
  • v 是数组中i下标位置的值
  • i,v是for代码块中的局部变量
  • 如果忽略下标i,可以使用"_"

(三)应用案例

随机生成5个数,并将其反转打印。

package main

import (
    "fmt"
    "time"
    "math/rand"
 )

func main() {

    var intArr [5]int

    len := len(intArr)

    rand.Seed(time.Now().UnixNano())

    for i := 0; i < len; i++ {
        intArr[i] = rand.Intn(100) // 生成 大于等于0,小于100的5个数
    }

    fmt.Println("交换前:", intArr)

    // 进行交换
    temp := 0
    for i := 0; i < len / 2; i++ {
        temp = intArr[len - 1 - i]
        intArr[len - 1 - i] = intArr[i]
        intArr[i] =temp
    }
    fmt.Println("交换后:", intArr)
    
}
/*
交换前: [42 43 95 0 67]
交换后: [67 0 95 43 42]
*/

三、注意事项

  • 数组是多个相同类型数据的组合,一旦一个数组定义了,长度是固定的,不能动态变化
  • var arr []int 此时arr是一个slice切片
  • 数组中的元素可以是任何类型的数据,但是不能混用
  • 数组创建后,如果没有初始化赋值,数值默认值是0,字符串是"",bool数组是false
  • 使用数组的步骤,(1)声明数组并且开辟空间;(2)给数组各个元素赋值;(3)使用数组
  • 数组下标是从0开始的,如果越界使用会报错
  • Go中的数组是值类型,因此拷贝不会互相影响,如果需要改变之前的数组中的值,可以传入数组引用

 

posted @ 2021-11-25 22:23  iveBoy  阅读(564)  评论(0编辑  收藏  举报
TOP