一文邃晓Go 中的可寻址和不成寻址
1. 甚么叫可寻址?文邃
可直接独霸 & 独霸符取地址的对象,就是晓G寻址可寻址的(Addressable)。比以上面这个例子
func main() { name := "iswbm" fmt.Println(&name) // output: 0xc000010200 } 法度圭表类型运转不会报错,中址声明 name 这个变量是成寻可寻址的。
但不克不及说 "iswbm" 这个字符串是文邃可寻址的 。
"iswbm" 是晓G寻址字符串,字符串都是中址不成变的 ,是成寻不成寻址的 ,后背会引见到 。文邃
在最早一一引见之前,晓G寻址先说一下结论
- 指针可以寻址:&Profile{ }
- 变量可以寻址:name := Profile{ }
- 字面量实足不克不及寻址 :Profile{ }
2. 哪些是中址可以寻址的?
变量:&x
func main() { name := "iswbm" fmt.Println(&name) // output: 0xc000010200 } 指针 :&*x
type Profile struct { Name string } func main() { fmt.Println(unsafe.Pointer(&Profile{ Name: "iswbm"})) // output: 0xc000108040 } 数组元素索引: &a[0]
func main() { s := [...]int{ 1,2,3} fmt.Println(&s[0]) // output: xc0000b4010 } 切片
func main() { fmt.Println([]int{ 1, 2, 3}[1:]) } 切片元素索引 :&s[1]
func main() { s := make([]int , 2, 2) fmt.Println(&s[0]) // output: xc0000b4010 } 组合字面量: &struct{ X type}{ value}
全数的组合字面量都是不成寻址的,就像上面多么子
type Profile struct { Name string } func new() Profile { return Profile{ Name: "iswbm"} } func main() { fmt.Println(&new()) // cannot take the address of new() } 寄看上面写法与这个写法的成寻分辨,上面这个写法代表不合意思,文邃个中的晓G寻址 & 真实不是取地址的独霸,而代表实例化一个筹划体的中址指针。
type Profile struct { Name string } func main() { fmt.Println(&Profile{ Name: "iswbm"}) // ok } 当然组合字面量是不成寻址的,但却可以对组合字面量的字段属性举办寻址(直接访谒)
type Profile struct { Name string } func new() Profile { return Profile{ Name: "iswbm"} } func main() { fmt.Println(new().Name) } 3. 哪些是不成以寻址的?
常量
import "fmt" const VERSION = "1.0" func main() { fmt.Println(&VERSION) } 字符串
func getStr() string { return "iswbm" } func main() { fmt.Println(&getStr()) // cannot take the address of getStr() } 函数或编制
func getStr() string { return "iswbm" } func main() { fmt.Println(&getStr) // cannot take the address of getStr } 根本圭表类型字面量
字面量分:根本圭表类型字面量 和 复合型字面量 。
根本圭表类型字面量,是一个值的文本展示,都是不睬应也是不成以被寻址的 。
func getInt() int { return 1024 } func main() { fmt.Println(&getInt()) // cannot take the address of getInt() } map 中的元素
字典斗劲出格,可以从两个角度来反向推导,假定字典的元素是可寻址的,会展示 甚么问题?
假定字典的元素不存在,则前去零值,而零值是不成变对象,假定能寻址问题就除夜了 。
而假定字典的元素存在 ,思虑到 Go 中 map 完成中元素的地址是改削的,这意味着寻址的下场也是有时义的 。
基于这两点 ,Map 中的元素不成寻址 ,契合常理。
func main() { p := map[string]string { "name": "iswbm", } fmt.Println(&p["name"]) // cannot take the address of p["name"] } 弄懂了这点,你理应可以邃晓上面这段代码为甚么会报错啦~
package main import "fmt" type Person struct { Name string Email string } func main() { m := map[int]Person{ 1:Person{ "Andy", "1137291867@qq.com"}, 2:Person{ "Tiny", "qishuai231@gmail.com"}, 3:Person{ "Jack", "qs_edu2009@163.com"}, } //编译偏向:cannot assign to struct field m[1].Name in map m[1].Name = "Scrapup" 数组字面量
数组字面量是不成寻址的,当你对数组字面量举办切片独霸 ,真实就是寻觅内部元素的地址,上面这段代码是会报错的
func main() { fmt.Println([3]int{ 1, 2, 3}[1:]) // invalid operation [3]int literal[1:] (slice of unaddressable value) } 到此这篇关于一文邃晓Go 中的可寻址和不成寻址的文章就引见到这了,更多相干Go 中可寻址和不成寻址内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !


