golang中数组–值类型
区别于C语言, golang中将一个数组看作是一个值类型,这里与C语言作为对比进行解释。
在C语言中,例如定义一个int类型的数组
int array[10] = {12, 23, 34, 45, 56};
则array实际上代表的是一个地址,例如在函数的参数传递中,实际参数传递一个int数组的数组名, 实际上把该数组的地址传递给了函数。
#include <stdio.h>
void show_array(int *array, int length);
void show_array(int *array, int length)
{
int i = 0;
for(i = 0; i < length; i++){
printf("%d ", array[i])
}
printf("\n")
}
int main(int argc, char **argv)
{
int array[10] = {12, 23, 34, 45, 56};
show_array(array, sizeof(array)/ sizeof(int))
}
实际上show_array函数中接受的只是array数组的地址。而在golang中如果将数组作为参数传递,则会发生拷贝现象。在函数体中无法修改传入的数组的内容,因为函数内操作的只是所传入数组的一个副本。
定义一个int数组:
array := [10]int {1, 2, 3, 4, 5}
编写修改数组内容的函数:
func modifyArray(array [10]int) {
array[3] = 40
fmt.Println("In modifyArray() function, array values: ", array)
}
在main()中打印调用modifyArray后的数组的值:
modifyArray(array)
fmt.Println("In main() function, array values: ", array)
调用后的结果如下所示:
In modifyArray() function, array values: [1 2 3 40 5 0 0 0 0 0]
In main() function, array values: [1 2 3 4 5 0 0 0 0 0]
主函数中int数组并未被修改,如果想要在函数内部操作外部的数据结构。需要用到数组切片功能。后边会对大家进行讲解。
本文对比了Golang与C语言中数组的处理方式,详细介绍了Golang中数组被视为值类型的特点,即当数组作为参数传递时会发生拷贝,因此在函数内部无法直接修改原始数组。通过具体代码示例展示了这一特性,并指出了使用数组切片来解决此限制的方法。

被折叠的 条评论
为什么被折叠?



