golang中的数组与C中数组的区别

本文深入探讨Go语言中数组的特点及使用方法,包括数组作为值而非指针、传递时的长度检查、指针移动限制等内容,并通过实例展示了如何正确地操作数组。
golang中的数组是这样说的: Arrays are values, not implicit pointers as in C.

1、数组做参数时, 需要被检查长度.
2、变量名不等于数组开始指针!
3、不支持C中的*(ar + sizeof(int))方式的指针移动. 需要使用到unsafe包

4、如果p2array为指向数组的指针, *p2array不等于p2array[0]


例子1 :数组做参数时, 需要被检查长度

func use_array(args [4]int) {
	args[1] = 100
}

func main() {
	var args = [5]int{1, 2, 3, 4, 5}
	use_array(args)
	fmt.Println(args)
}
编译出错:cannot use args (type [5]int) as type [4]int in argument to use_array

需要有长度上的检查

例子2: 变量名不等于数组开始指针

func use_array(args [5]int) {
	args[1] = 100
}

func main() {
	var args = [5]int{1, 2, 3, 4, 5}
	use_array(args)
	fmt.Println(args)
}
输出结果:[1 2 3 4 5]

没有保存結果, 数组名的用法与C的不一样. 在golang里是这样的:

// 有长度检查, 也为地址传参
func use_array(args *[4]int) {
	args[1] = 100 //但是使用还是和C一致,不需要别加"*"操作符
}

func main() {
	var args = [4]int{1, 2, 3, 4}
	use_array(&args) // 数组名已经不是表示地址了, 需要使用"&"得到地址
	fmt.Println(args)
}
输出结果:[1 100 3 4]
例子3 :如果p2array为指向数组的指针,*p2array不等于p2array[0]

import (
	"fmt"
)

func main() {
	var p2array *[3]int
	p2array = new([3]int)
	fmt.Printf("%x\n", *p2array+1) // 不管p2array是指针变量还是数组变量, 都只能使用"[]"方式使用
}
编译出错:invalid operation: *p2array + 1 (mismatched types [3]int and int)

golang中获取数组地址的2中方法:

func use_array(args *[4]int) {
	args[1] = 100                            //但是使用还是和C一致,不需要别加"*"操作符
	fmt.Printf("%v\n", unsafe.Pointer(args)) //获取数组地址方法1
}

func main() {
	var args = [4]int{1, 2, 3, 4}
	use_array(&args)             // 数组名已经不是表示地址了, 需要使用"&"得到地址
	fmt.Printf("%v\n", &args[0]) //获取数组地址方法2
	fmt.Println(args)
}

输出结果:

0x116b2160

0x116b2160

[1 100 3 4]






<think>好的,用户的问题是关于Golang数组定义时冒号的作用,特别是冒号在数组初始化中的语法。我需要先回忆一下Golang的相关语法,并参考提供的引用内容来确保回答的准确性。 首先,根据引用[4]中的例子,用户提到了数组的声明初始化,比如`primes := [6]int{1, 2, 3, 4, 5, 6}`。这里的冒号其实是短变量声明的一部分,即`:=`操作符。短变量声明在Go中用于声明并初始化变量,同时根据右侧的值自动推断类型。所以用户提到的冒号应该是指`:=`这个符号,而不是单独的冒号。 接下来,需要解释`:=`的作用。根据引用[1],Go会自动初始化变量的默认值,但使用短变量声明时,变量会被显式初始化,并且类型由右侧表达式决定。例如,`a := [3]int{1,2,3}`中,数组的长度类型都被确定了。 然后,要区分数组的几种初始化方式。比如使用`var`声明数组时,需要指定类型可能的初始值,而使用`:=`则可以省略类型,由编译器推断。例如,`var a [2]string``primes := [...]int{1,2,3,4,5,6}`。这里可能用户提到的冒号出现在`:=`中,或者在数组字面量中使用`...`来推断长度。 另外,引用[4]中提到数组的长度是类型的一部分,不能改变,但切片更灵活。用户的问题集中在数组初始化,因此需要明确说明冒号在短变量声明中的使用,以及可能的数组字面量语法。 可能用户混淆了`:=`中的冒号数组的其他语法,比如切片中的冒号(如`s := arr[1:3]`)。需要指出在数组初始化中,冒号仅在短变量声明中出现,而数组本身的定义可能使用`{}``...`来推断长度。 最后,结合引用中的例子,总结冒号在数组初始化中的具体应用场景,强调`:=`的作用数组字面量的不同写法,确保用户理解正确的语法结构。</think>在 Golang 中,数组定义时使用的冒号`:`实际上是**短变量声明语法`:=`**的一部分,用于声明并初始化数组变量。以下是具体解析: --- ### 1. 短变量声明语法 `:=` 运算符表示**声明变量并赋予初始值**,编译器会自动推断变量类型。 在数组初始化中: ```go // 显式声明数组长度 arr1 := [3]int{1, 2, 3} // 类型为 [3]int // 编译器推断数组长度 arr2 := [...]int{4, 5, 6} // 类型为 [3]int ``` - `[...]` 表示由初始化值的数量自动推导数组长度[^4] - `arr1` `arr2` 的底层类型不同(长度是数组类型的一部分)[^4] --- ### 2. 数组初始化对比 | **声明方式** | **示例** | **特点** | |-----------------------|-----------------------------------|-----------------------------------| | 标准 var 声明 | `var a [2]string` | 需指定类型,默认零值初始化[^1] | | 短变量声明 `:=` | `b := [...]int{1, 2}` | 自动类型推断,需显式初始化 | | 带长度的显式初始化 | `c := [3]float64{3.14, 6.28}` | 未赋值的元素初始化为零值[^2] | --- ### 3. 常见错误场景 ```go // 错误:数组长度初始化值不匹配 x := [2]int{1, 2, 3} // 编译报错 // 正确:切片初始化(注意中括号无长度) y := []int{1, 2, 3} // 类型是切片 []int ``` - 数组长度必须初始化值数量一致(或使用 `...` 自动推导) - 切片使用`[]`而非`[...]`,且长度动态可变 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值