返回顶部
首页 > 资讯 > 后端开发 > GO >一文理解Go 中的可寻址和不可寻址
  • 558
分享到

一文理解Go 中的可寻址和不可寻址

2024-04-02 19:04:59 558人浏览 独家记忆
摘要

目录1. 什么叫可寻址?2. 哪些是可以寻址的?变量:&x指针:&*x数组元素索引: &a[0]切片切片元素索引:&s[1]组合字面量

1. 什么叫可寻址?

可直接使用 & 操作符取地址的对象,就是可寻址的(Addressable)。比如下面这个例子


func main() { 
    name := "iswbm" 
    fmt.Println(&name)  
    // output: 0xc000010200 
} 

程序运行不会报错,说明 name 这个变量是可寻址的。

但不能说 "iswbm" 这个字符串是可寻址的。

"iswbm" 是字符串,字符串都是不可变的,是不可寻址的,后面会介绍到。

在开始逐个介绍之前,先说一下结论

  • 指针可以寻址:&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() 
} 


注意上面写法与这个写法的区别,下面这个写法代表不同意思,其中的 & 并不是取地址的操作,而代表实例化一个结构体的指针。


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 中的元素

字典比较特殊,可以从两个角度来反向推导,假设字典的元素是可寻址的,会出现 什么问题?

如果字典的元素不存在,则返回零值,而零值是不可变对象,如果能寻址问题就大了。

而如果字典的元素存在,考虑到 Gomap 实现中元素的地址是变化的,这意味着寻址的结果也是无意义的。

基于这两点,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 中可寻址和不可寻址内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 一文理解Go 中的可寻址和不可寻址

本文链接: https://lsjlt.com/news/137585.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文理解Go 中的可寻址和不可寻址
    目录1. 什么叫可寻址?2. 哪些是可以寻址的?变量:&x指针:&*x数组元素索引: &a[0]切片切片元素索引:&s[1]组合字面量...
    99+
    2024-04-02
  • 探讨Go语言中不可寻址的值
    在Go语言中,有一些值是不可寻址的,即无法取得它们的内存地址。这些值包括常量、字面量和不能被取地址的表达式。在本文中,我们将探讨这些不可寻址的值,并通过具体的代码示例来理解它们的特性。...
    99+
    2024-04-02
  • Go语言中的不可寻址数值探究
    Go语言中的不可寻址数值探究 在Go语言中,存在着一些不可寻址的数值类型,即无法获取其地址的值。这些不可寻址的值在编程过程中可能会导致一些困惑和错误,因此有必要对其进行深入探究并了解其...
    99+
    2024-04-02
  • 讨论Go语言中不可寻址数值的特性
    Go语言是一种编译型、并发性强的程序设计语言,它具有高效性和简洁性的特点,得到了广泛的应用。在Go语言中,有一种特性是不可寻址数值,即不可取得其内存地址的数值。本文将讨论这一特性,并通...
    99+
    2024-04-02
  • 解析Go语言中无法寻址的值
    Go语言中的指针是一种非常强大的特性,允许程序员直接访问和操作内存中的地址。但是,在Go语言中也存在一些无法寻址的值,即不能获取其内存地址的变量。本文将针对这些无法寻址的值进行深入探讨...
    99+
    2024-04-02
  • Linux内存管理和寻址的概念是什么
    本篇内容主要讲解“Linux内存管理和寻址的概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内存管理和寻址的概念是什么”吧!1.概念内存管理模式段式:内存分为了多段,每段都是连...
    99+
    2023-06-21
  • NB-IoT和WiFi之外,探寻下一代网络的可能性
    没有人会否认,城市的便利生活一大部分都要来自无线网的加持,现代人的命都是WiFi给的。至于智慧城市、自动化工厂、车联网、AIoT……这些炫酷的概念名词想要真正进驻产业,也离不开对通讯网络的仰赖。说到底,智能生活的希望还要靠下一代通信网络。在...
    99+
    2023-06-06
  • 您是否在寻找一个可以处理对象和日志的Go IDE?这里是一些可以帮助您的选择!
    Go语言是一门受欢迎的编程语言,因为它的高效性和易于编写的语法。对于Go语言的开发人员来说,一个好的集成开发环境(IDE)是必不可少的。在这篇文章中,我们将探讨一些可以处理对象和日志的Go IDE的选择。 Visual Studio Co...
    99+
    2023-07-20
    ide 对象 日志
  • Go 打包 NumPy API:是不是你一直在寻找的解决方案?
    NumPy 是 Python 中最常用的科学计算库之一,提供了丰富的数学函数和数据结构,但在处理大型数据时,其性能表现并不理想。Go 语言则以其高效的并发能力和快速的执行速度著称,那么将 NumPy API 打包到 Go 语言中,能否实现...
    99+
    2023-10-20
    打包 numy api
  • 代理服务器可能有问题,或地址不正确(已解决)
    解决代理服务器可能有问题,或地址不正确 1. 问题描述2. 解决方法 1. 问题描述   如果遇到电脑连上wifi,其他应用可以上网(例如可以登录QQ),但是浏览器不能浏览网页,出现代理服务器可能有问题,或地址不正确 这个错误,...
    99+
    2023-08-21
    网络 服务器 运维
  • 你是否正在寻找一个Python IDE,可帮助你打包你的代码并处理不同类型的数据?
    Python是一种优秀的编程语言,可用于处理各种类型的数据和编写各种类型的应用程序。但是,与许多其他编程语言一样,Python需要一个集成开发环境(IDE)来管理代码和提供一些便利的工具。在本文中,我们将介绍一些最受欢迎的Python ID...
    99+
    2023-10-17
    打包 ide 数据类型
  • 解决:centos7如何解决网络不可达和wget: 无法解析主机地址 “downloads.mysql.com”
    遇到此类问题可能会有多重解决方法,需要一个一个的去排除。 查看自己的网络设置是不是设置的NAT模式,设置完成后再去ping一下网络地址。  2、ping一下百度看能不能拼成功,下图是ping成功的样式。(如果不行继续往下走) [root@l...
    99+
    2023-09-27
    centos
  • Git中如何设置不一样的fetch和push地址
    本文小编为大家详细介绍“Git中如何设置不一样的fetch和push地址”,内容详细,步骤清晰,细节处理妥当,希望这篇“Git中如何设置不一样的fetch和push地址”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-04
  • Go语言开发中不可或缺的一个包
    Go语言作为一种强大的编程语言,广泛应用于各种领域的开发中。在Go语言开发中,有许多优秀的包可以帮助开发人员提升效率和简化开发流程。其中有一个包在Go语言开发中不可或缺,那就是fmt包...
    99+
    2024-04-02
  • Python中可变和不可变对象的深入讲解
    目录前置知识 有哪些可变对象,哪些不可变对象? 不可变对象和可变对象的区别? 不可变对象的应用场景 从内存角度出发说下有什么区别? 不可变对象可变对象从代码角度看看区别 不可变对象...
    99+
    2024-04-02
  • 一篇文章让你彻底了解Java可重入锁和不可重入锁
    可重入锁  广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。 ...
    99+
    2024-04-02
  • 您是否正在寻找一种更高效的方法来处理数据?Python NumPy函数可能是您的救星!
    Python作为一种高级编程语言,有着极高的灵活性和强大的功能。在数据科学领域,Python也成为了最流行的编程语言之一。Python NumPy函数是Python数据科学库中一个非常重要的模块,它提供了高效的数据操作和数值计算功能。在本...
    99+
    2023-08-06
    numy 函数 bash
  • vue项目打包之后生成一个可修改IP地址的文件(具体操作)
    今天在做项目的时候遇到了一个问题, 就是把项目部署到不同的服务器上, 但不能每次修改IP的时候就打包一次, 这就增加了前端的工作量,经过百度, 发现有一些方法是可以的,亲测可用。 具...
    99+
    2023-03-19
    vue打包生成可修改IP地址的文件 vue打包ip修改 vue打包修改ip
  • 你是否在寻找更好的代码管理方案?了解一下ASP、LeetCode和npm的完美组合!
    在现代软件开发中,代码管理是非常重要的一环。良好的代码管理方案可以提高开发团队的工作效率,减少错误率,提高代码质量。ASP、LeetCode和npm是三个非常流行的工具,它们的结合可以提供一个完美的代码管理解决方案。 ASP是一个开源的W...
    99+
    2023-07-22
    leetcode 同步 npm
  • 为什么我不能获取 golang 中函数的地址,但可以获取函数值
    php小编子墨为您解答:为什么我不能获取 golang 中函数的地址,但可以获取函数值?在Golang中,函数值是可以被获取的,因为函数值是一种可以被调用的类型。而函数的地址则是不可获...
    99+
    2024-02-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作