go语言笔记——数组长度不可变,但是元素值是可变的!!!
2017-05-16 16:16
239 查看
数组声明的格式是:
例如:
在内存中的结构是:
对索引项为 i 的数组元素赋值可以这么操作:
由于索引的存在,遍历数组的方法自然就是使用 for 结构:
IDIOM:
也可以使用 for-range 的生成方式:
IDIOM:
在这里i也是数组的索引。当然这两种 for 结构对于切片(slices)(参考 第 7 章)来说也同样适用。
问题 7.1 下面代码段的输出是什么?
Go 语言中的数组是一种 值类型(不像 C/C++ 中是指向首元素的指针),所以可以通过
那么这种方式和
这样的结果就是当把一个数组赋值给另一个时,需要在做一次数组内存的拷贝操作。例如:
这样两个数组就有了不同的值,在赋值后修改 arr2 不会对 arr1 生效。
所以在函数中数组作为参数传入时,如
如果你想修改原数组,那么 arr2 必须通过&操作符以引用方式传过来,例如 func1(&arr2),下面是一个例子
示例 7.2 pointer_array.go:
输出结果:
另一种方法就是生成数组切片并将其传递给函数(详见第 7.1.4 节)。
摘自:https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.1.md
var identifier [len]type
例如:
var arr1 [5]int
在内存中的结构是:
对索引项为 i 的数组元素赋值可以这么操作:
arr[i] = value,所以数组是 可变的。
由于索引的存在,遍历数组的方法自然就是使用 for 结构:
IDIOM:
for i:=0; i < len(arr1); i++{ arr1[i] = ... }
也可以使用 for-range 的生成方式:
IDIOM:
for i,_:= range arr1 { ... }
在这里i也是数组的索引。当然这两种 for 结构对于切片(slices)(参考 第 7 章)来说也同样适用。
问题 7.1 下面代码段的输出是什么?
a := [...]string{"a", "b", "c", "d"} for i := range a { fmt.Println("Array item", i, "is", a[i]) }
Go 语言中的数组是一种 值类型(不像 C/C++ 中是指向首元素的指针),所以可以通过
new()来创建:
var arr1 = new([5]int)。
那么这种方式和
var arr2 [5]int的区别是什么呢?arr1 的类型是
*[5]int,而 arr2的类型是
[5]int。
这样的结果就是当把一个数组赋值给另一个时,需要在做一次数组内存的拷贝操作。例如:
arr2 := *arr1 arr2[2] = 100
这样两个数组就有了不同的值,在赋值后修改 arr2 不会对 arr1 生效。
所以在函数中数组作为参数传入时,如
func1(arr2),会产生一次数组拷贝,func1 方法不会修改原始的数组 arr2。
如果你想修改原数组,那么 arr2 必须通过&操作符以引用方式传过来,例如 func1(&arr2),下面是一个例子
示例 7.2 pointer_array.go:
package main import "fmt" func f(a [3]int) { fmt.Println(a) } func fp(a *[3]int) { fmt.Println(a) } func main() { var ar [3]int f(ar) // passes a copy of ar fp(&ar) // passes a pointer to ar }
输出结果:
[0 0 0] &[0 0 0]
另一种方法就是生成数组切片并将其传递给函数(详见第 7.1.4 节)。
摘自:https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.1.md
相关文章推荐
- GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别
- Go语言学习笔记2——数组和Slice
- Go语言学习笔记之数组、数组切片和map
- Go学习笔记-Go语言数组array和切片slice
- go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针
- Go语言学习笔记八: 数组
- go语言中的数组切片:特立独行的可变数组
- Go语言学习笔记(三)数组 & 切片 & map
- Go语言获取数组长度的方法
- Go语言学习笔记八: 数组
- go语言中的数组切片:特立独行的可变数组
- 二、slice和数组的区别,map的注意事项 -go语言笔记
- C 语言 实现 字符串 分割 函数(返回"二维字符数组",及分割后的字符数组的长度)
- Go语言中的数组(array)和数组切片(slice)
- go语言学习笔记之slice用法
- C语言长度为0的数组的使用
- C语言长度为0的数组的使用
- C语言中如何求任意一个int型数组的长度?
- 实现一个"可变二维数组",这个二维数组的行数要求用户从键盘输入,每行的元素个数仍由用户从键盘输入. //数组元素值用户可以自定义.最后把二维数组打印出来.不要忘记释放数组内存. /*void main
- C程序设计语言整理笔记(五)指针与数组