【GoLang】3.2 数组


  数组基本上在除了python以外的各个编程语言里都是存在的。GoLang数组的特殊性在于语法上,这种写法,我这种长期写java和python的程序员就非常不习惯。但是不习惯也没办法,硬着头皮去适应吧。有很多语法点是我以前的编程经历里没有的,所以我一个个记下来。

数组声明

  以往写C、java之类的语言,数组定义的中括号是写在类型后面或变量名后面的。而现在要这样写了,也就是写在类型前面:

package main

import "fmt"

func main() {
	var q [3]int
	q = [3]int{1, 2, 3}
	fmt.Println(q)
}

字面量

  字面量的长度可以自动计算,但不是像java一样在方括号里不写长度,而是一种非常奇怪的语法,在方括号里写上三个点号。如下:

package main

import "fmt"

func main() {
	q := [...]int{1, 2, 3, 4, 5, 6, 7}
	fmt.Println(q, len(q))
}

长度与类型

  Go的数组还有个奇怪的地方,长度也是类型的一部分。长度为3的int数组和长度为4的int数组不是同一个类型。长度不同,类型就不相同,这点颠覆了我的编程认知,哈哈。

package main

func main() {
	q := [...]int{1, 2, 3}
	q = [...]int{1, 2, 3, 4}
	println(q)
}

  上述代码编译后会报错:

# array-len
.\main.go:5:6: cannot use [...]int{…} (value of type [4]int) as type [3]int in assignment

键值对语法

  在字面量定义的语法里,键值对语法很有意思。它适合这种一种场景,除特殊的几个索引外,其余索引全部为0值。如我要构造一个长度为8的数组,第4个元素(以0开始)为7,就可以这样写:

package main

import "fmt"

func main() {
	array := [8]rune{4: 7}
	fmt.Println(array)
}

  输出:

[0 0 0 0 7 0 0 0]

值类型

  GoLang中数组是值类型,怎么理解呢?就是说把一个数组赋值给变量是把值赋过去,这点和java不一样,所以这个时候修改数组各个索引的值不会影响原变量。以一个例子来说明:

package main

import "fmt"

func main() {

	a := [...]rune{1, 2, 3}
	b := a
	b[0] = 2
	fmt.Println(a, b)
}

  输出结果是:

[1 2 3] [2 2 3]

多维数组

  多维数组,外层到内层是从左到右的写法,比如 3 × 4 3\times 4 3×4的二维数组,外层是长度为3的数组,里面每个元素都是长度为4的数组,写起来就是[3][4].但是多维数组还有个奇怪的语法点,就是写字面量时,外层的最后一个逗号不能省略。我写段代码说明哪个逗号不能省略吧:

package main

import "fmt"

func main() {
	a := [3][4]rune{
		{1, 2, 3, 4},
		{2, 1, 3, 4},
		{3, 1, 2, 4},// 这个逗号不能省略
	}
	fmt.Println(a)
}

  输出结果:

[[1 2 3 4] [2 1 3 4] [3 1 2 4]]

  对于用三个点自动推断长度的语法,在多维数组这,只能用于第一维度。所以上面的例子可以改成:

	a := [...][4]rune{
		{1, 2, 3, 4},
		{2, 1, 3, 4},
		{3, 1, 2, 4}, // 这个逗号不能省略
	}

  如果强行用,编译不会报错,但是运行会报错:

.\main.go:6:12: invalid use of [...] array (outside a composite literal)

  数组是定长的,如果要可扩容的,就需要使用切片了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Golang数组和切片是两种不同的数据类型,用于存储相同数据类型的容器。数组的长度是固定的,而切片的长度是可变的。在日常应用中,切片的使用更为普遍。 数组在声明时需要指定长度,并且在初始化时必须提供相同长度的元素。例如,`a := int{1, 2, 3}`就是一个长度为3的整数数组数组的长度一旦确定后就不能更改。 切片是基于数组的引用类型。它不需要指定固定的长度,并且可以根据需要动态扩展或缩小。切片包装着底层数组,通过指定起始索引和结束索引来指定子集。例如,`b := a[:]`就是一个切片,它包含了数组a的所有元素。 数组适用于需要固定长度的场景,而切片适用于长度可变的情况。在实际应用中,切片更常用,因为它提供了更大的灵活性和便利性。 总结: - 数组是长度固定的容器,切片是长度可变的容器; - 数组在声明时需要指定长度,切片则不需要; - 数组的长度一旦确定后就不能更改,而切片可以根据需要动态扩展或缩小; - 切片是基于数组的引用类型,可以通过指定起始索引和结束索引来指定子集。 参考资料: Golang中的「数组」和「切片」都是存储同一数据类型的容器,只不过Golang中的数组长度是固定的,而切片的长度是可变化的。 切片是引用类型,切片包装的数组称为该切片的底层数组。我们来看一段代码://a是一个数组,注意数组是一个固定长度的,初始化时候必须要指定长度,不指定长度的话就是切片了 a := int{1, 2, 3} //b是数组,是a...。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒过来摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值