go语言中数组加括号 golang数组添加元素( 二 )


x: int
p: pointer to int
a: array[3] of int
【go语言中数组加括号 golang数组添加元素】这样的声明即便有些冗长,当至少是清晰的——你只需从左向右读就行 。Go 语言所采用的方案就是以此为基础的,但为了追求简洁性,Go 语言丢掉了冒号并去掉了部分关键词,成了下面这样:
x int
p *int
a [3]int
在 [3]int 和表达式中 a 的用法没有直接的对应关系(我们在下一节会回过头来探讨指针的问题) 。至此 , 你获得了代码清晰性方面的提升,但付出的代价是语法上需要区别对待 。
下面我们来考虑函数的问题 。虽然在 Go 语言里,main 函数实际上没有参数 , 但是我们先誊抄一下之前的 main 函数的声明:
func main(argc int, argv *[]byte) int
粗略一看和 C 没什么不同,不过自左向右读的话还不错 。
main 函数接受一个 int 和一个指针并返回一个 int 。
如果此时把参数名去掉,它还是很清楚——因为参数名总在类型的前面,所以不会引起混淆 。
func main(int, *[]byte) int
这种自左向右风格的声明的一个价值在于,当类型变得更复杂时,它依然相对简单 。下面是一个函数变量的声明(相当于 C 语言里的函数指针)
f func(func(int,int) int, int) int
或者当它返回一个函数时:
f func(func(int,int) int, int) func(int, int) int
上面的声明读起来还是很清晰 , 自左向右,而且究竟哪一个变量名是当前被声明的也容易看懂——因为变量名永远在首位 。
类型语法和表达式语法带来的差别使得在 Go 语言里调用闭包也变得更简单:
sum := func(a, b int) int { return a+b } (3, 4)
指针
指针有些例外 。注意在数组 (array )和切片 (slice) 中,Go 的类型语法把方括号放在了类型的左边,但是在表达式语法中却又把方括号放到了右边:
var a []int
x = a[1]
类似的,Go 的指针沿用了 C 的 * 记法,但是我们写的时候也是声明时 * 在变量名右边,但在表达式中却又得把 * 放到左左边:
var p *int
x = *p
不能写成下面这样
var p *int
x = p*
因为后缀的 * 可能会和乘法运算混淆 , 也许我们可以改用 Pascal 的 ^ 标记,像这样
var p ^int
x = p^
我们也许还真的应该把 * 像上面这样改成 ^ (当然这么一改 xor 运算的符号也得改) , 因为在类型和表达式中的 * 前缀确实把好些事儿都搞得有点复杂,举个例子来说 , 虽然我们可以像下面这样写
[]int("hi")
但在转换时,如果类型是以 * 开头的 , 就得加上括号:
(*int)(nil)
如果有一天我们愿意放弃用 * 作为指针语法的话,那么上面的括号就可以省略了 。
可见,Go 的指针语法是和 C 相似的 。但这种相似也意味着我们无法彻底避免在文法中有时为了避免类型和表达式的歧义需要补充括号的情况 。
总而言之,尽管存在不足,但我们相信 Go 的类型语法要比 C 的容易懂 。特别是当类型比较复杂时 。
go语言中函数定义结尾的小括号是怎么回事其实,这就是在调用这个函数,等同于:
例如,
运行结果:
又如:
运行结果一样的 。
数组内中括号?C语言中没有这样的写法,你这应该是编译不通过的 。如果是js数组对象的话也是不行,因为js都是var开头声明变量的 。如果非要让这种写法可以只能自己创造一门编程语言了,然后对这个语义进行解析 。
go语言中数组使用的注意事项和细节1、数组是多个 相同类型 的数据的组合,一个数组一旦声明/定义了,其 长度是固定的 , 不能动态变化。

推荐阅读