August Rush

一个还在努力成长的小火汁!

游龙当归海,海不迎我自来也。

We create our own demons.

You can reach me at augustrush0923@gmail.com
Go语言基础-数组
发布:2021年01月14日 | 作者:augustrush | 阅读量: 1010

数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,所以在Go语言中很少直接使用数组。

声明数组

方式一:(先声明 再赋值)

var numbers [3]int // 内存开辟3个内存空间,内存初始化的值为0

// 赋值
numbers[0] = 1
numbers[1] = 2
numbers[2] = 3

fmt.Println(numbers)

// 输出的结果为:[1 2 3]

方式二:(声明并直接初始化数组)

var languages = [2]string{"chinese", "english"}

fmt.Println(languages)
// 输出的结果为:[chinese english]

方式三:(声明并直接初始化数组并制定初始化指定位置)

girlfriends := [4]string{1: "taylor swift", 2: "三上悠亚", 3: "明里紬"}
fmt.Println(girlfriends)
// 输出的结果为:[ taylor swift 三上悠亚 明里紬]

方式四:(省略个数)

score := [...]int{80, 90, 100}
fmt.Println(score)
// 输出的结果为:[80 90 100]

声明 指针类型的数组。不会开辟内存初始化数值中的值 默认=nil

var poker *[3]int
fmt.Println(poker)
// 输出的结果为:<nil>

声明数组并初始化,返回的是指针类型的数组

a := new([3]int)
fmt.Println(a)
// 输出的结果为:&[0 0 0]


数组的内存管理

  • 数组的内存是连续的
// 数组的内存是连续的;
fmt.Printf("girlfriends的内存地址为:%p \n", &girlfriends)

// 输出的结果为:girlfriends的内存地址为:0xc0000b0040
  • 数组的内存地址实际上是数组内第一个元素的内存地址
fmt.Printf("girlfriends的第一个元素的内存地址为:%p \n", &girlfriends[0])
fmt.Printf("girlfriends的第二个元素的内存地址为:%p \n", &girlfriends[1])
fmt.Printf("girlfriends的第三个元素的内存地址为:%p \n", &girlfriends[2])

/* 
输出的结果为:
        girlfriends的第一个元素的内存地址为:0xc0000b0040
        girlfriends的第二个元素的内存地址为:0xc0000b0050
        girlfriends的第三个元素的内存地址为:0xc0000b0060
*/
  • 数组内的字符串的内部存储:len+(str=指针)


数组的特性:可变和拷贝

可变, 数组的元素可被更改(但长度和类型不可修改)

games := [3]string{"英雄联盟", "赛博朋克2077", "健身环大冒险"}
fmt.Println(games[2])
games[2] = "动物森友会"
fmt.Println(games[2])

/*
输出的结果:
        健身环大冒险
        动物森友会
*/

拷贝,变量赋值时重新拷贝一份(类似于Python深拷贝?)

allGames := games
games[2] = "健身环大毛线"
fmt.Println(games)
fmt.Printf("games的内存地址为:%p \n", &games)
fmt.Println(allGames)
fmt.Printf("allGames的内存地址为:%p \n", &allGames)

/*
输出的结果:
        [英雄联盟 赛博朋克2077 健身环大毛线]
        games的内存地址为:0xc0000901b0
        [英雄联盟 赛博朋克2077 动物森友会]
        allGames的内存地址为:0xc0000901e0
*/


长度、索引、切片和循环

长度

girlfriends := [4]string{"null", 1: "taylor swift", 2: "三上悠亚", 3: "明里紬"}
fmt.Println(len(girlfriends))

// 输出的结果为:4

索引

fmt.Println(girlfriends[0])
fmt.Println(girlfriends[1])
fmt.Println(girlfriends[2])
/*
输出的结果为:
        null
        taylor swift
        三上悠亚
*/

切片

fmt.Println(girlfriends[0:2])

// 输出的结果为:[null taylor swift]

循环

// 手动循环
for i := 0; i < len(girlfriends); i++ {
    fmt.Println(i, girlfriends[i])
}
/*
输出的结果为:
        0 null
        1 taylor swift
        2 三上悠亚
        3 明里紬
*/

// for range
for index, item := range girlfriends {
    fmt.Println(index, item)
}
/*
输出的结果为:
        0 null
        1 taylor swift
        2 三上悠亚
        3 明里紬
*/

// 如果只有一个变量 那么只返回索引
for index := range girlfriends {
    fmt.Println(index)
}
/*
输出的结果为:
        0
        1
        2
        3
*/

// 如果只需要结果,只需要用匿名变量接收index
for _, item := range girlfriends {
    fmt.Println(item)
}
/*
输出的结果为:
        null
        taylor swift
        三上悠亚
        明里紬
*/


数组嵌套(多维数组)

声明一个多维数组

方式一:

var nestData1 [2][3]int  // [[0,0,0],[0,0,0]]
var nestData2 [2][2][3]int  // [   [  [0,0,0],[0,0,0]  ] , [  [0,0,0 ] , [ 0,0,0 ]  ]  ]

nestData1[0] = [3]int{1, 2, 3}
nestData1[1] = [3]int{1: 5}
nestData1[1][0] = 4
fmt.Println(nestData1)

// 输出的结果为:[[1 2 3] [4 5 0]]

方式二

Data := [2][3]int {[3]int{11,22,33}, [3]int{1:44}}
fmt.Println(Data)

// 输出的结果为:[[11 22 33] [0 44 0]]


  • 标签云

  • 支付宝扫码支持一下

  • 微信扫码支持一下



基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建

京ICP备20007446号-1 & 豫公网安备 41100202000460号

网站地图 & RSS | Feed