一文邃晓Go 中的可寻址和不成寻址

娱乐 · 2026-07-20 19:33:54

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 中可寻址和不成寻址内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !

文章推荐:

江湖悠悠幻弈棋局攻略除夜全

卧龙吟2除夜乔气焰搭配攻略

浣熊不快活浣熊选择推荐攻略

严重影响网站搜索引擎优化的五项网页设计弊端

摩尔庄园手游秋千若何掉落踪掉落踪

同件衣服P上不合色彩  ,淘宝美工必备技能

从这五个条件 ,我们可以判断公司的SEO技术的高度

如何写好网络营销策划方案

鸿蒙琐细能打王者名望吗

精品文章可让用户快速寻找解决方案

高质量的内容更有利于搜索引擎优化和关键词排名

铁汉联盟手游周签到宝箱晋级攻略

热门浏览