一般的短声明和长声明可以相互转换,例如 var x int
和 x := 0
等价。
但有些好像无法完全等价转换?
var px *int // 空指针
px := new(int) // 不是空指针,分配了内存
// (如何用短声明得到空指针?)
var w io.Writer
var a interface{}
// (interface 类型的空表达式是什么...如何写成短声明)
var s []int // 这样底层数组的地址是 0x0 (slice header 的数组指针为空?)
s := []int{} // 这样底层数组的地址是 0x5168d0,类似一个容量为 0 的数组 (s := [0]int)
// 如何用短声明达到长声明的效果..
var m map[int]int // nil map
m := map[int]int{} // 不是 nil map,可以添加数据
// 怎样用短声明得到一个 nil map ?
1
yanyuan2046 2017-10-13 11:54:17 +08:00
短声明就是为了初始化,某些场景长声明=短声明是因为长声明默认初始化了,一般是基础类型。
你列的几种场景都不能等价,类似的还有 channel |
2
faceair 2017-10-13 12:11:39 +08:00
带了等于号就是赋值了啊,var 的定义只有类型声明的
|
3
SuperMild 2017-10-13 12:21:31 +08:00
所谓短声明,就是声明并负值。原则上与长声明不等价,之所以会出现结果相同的情况,只是由于偶然。
比如 var x int 和 x := 0 等价,是因为你偶然地对 x 负值 0,如果你写 x := 1,那就不等价了。注意,不是因为用了短声明而等价,而是因为偶然负值了 0 所以才等价。 |
4
HMSQQbA OP 啊...谢谢,感觉好不爽...很分裂的感觉
interface{} 的那个例子难道也没有短声明的等价吗? |
5
reus 2017-10-13 12:50:05 +08:00
px := (*int)(nil)
a := (interface{})(nil) s := ([]int)(nil) m := (map[int]int)(nil) |
6
HMSQQbA OP 啊!原来这样类型转换也可以。
``` s := ([]int)(nil) fmt.Printf("addr_s: %p addr_s_arr: %p content_s:%v len/cap_s:%v %v\n", &s, s, s, len(s), cap(s)) ``` addr_s: 0xc42006e060 addr_s_arr: 0x0 content_s:[] len/cap_s:0 0 谢谢... (说句题外话,Go 的 nil 也感觉怪怪的..) |
7
ChristopherWu 2017-10-13 18:31:09 +08:00
你理解错了短声明 与长声明了。
var x int 和 x := 0 完全不等价, 之所以等价, 是因为 var x int 里,x 未定义 时,go 刚好给你默认设置为 0 而已。 两者可以等同于 C 语言的: int x; int x = 0; 很明显,x 是未定义的,可以是任何值。 同理,任何长声明都是定义一个变量, 而短声明是定义并赋值一个变量。 |
8
HMSQQbA OP |