Go指针第一次赋值

2023-12-30

当我在玩弄闭包时,我偶然发现了这种行为。我无法理解它。

此代码片段的工作原理:

func main(){
    var a string = "foo"
    var b *string
    var c string = "bar"
    b = &c

    fmt.Printf("%s %s\n", a, *b)

    a = "hello"
    *b = "world"

    fmt.Printf("%s %s\n", a, *b)
}

然而这并没有:

func main(){
    var a string = "foo"
    var b *string
    *b = "bar"

    fmt.Printf("%s %s\n", a, *b)

    a = "hello"
    *b = "world"

    fmt.Printf("%s %s\n", a, *b)
}

https://play.golang.org/p/NHw3X__Wtd https://play.golang.org/p/NHw3X__Wtd

请比我聪明得多的人解释一下。


每个变量都被初始化为零值 https://golang.org/ref/spec#The_zero_value如果您没有显式指定初始值,则为它的类型。所有指针类型的零值是nil这意味着它还没有指向任何东西。

您可以随时将地址(指针值)分配给指针类型的变量。但是直到你初始化你的指针变量(除了nil),它什么也没有指向,因此你不能将任何东西分配给它指向的地方(因为那是“什么也没有”)。

为了设置指向的值,请首先对其进行初始化,以便它实际上指向您可以设置/更改的某个位置。这个初始化可能是其他一些变量的地址(与指向类型相同的类型 - 称为element类型),或者由内置函数返回的指向类型的某些新分配的零值的地址new() https://golang.org/pkg/builtin/#new功能。

这条线

var b *string

只是创建一个新变量b类型的*string,但它没有指定任何初始值,所以b将被初始化为nil。它不指向任何东西(或任何地方)。如果您尝试设置pointed value:

var b *string
*b = "bar"

你会遇到运行时恐慌:

panic: runtime error: invalid memory address or nil pointer dereference

让您能够设置pointed值,您需要用非nil指针值,例如:

b = new(string)

之后,您现在可以设置指向的值:

*b = "world"

请注意,当您这样做时:

var b *string
var c string = "bar"
b = &c

这会创建一个变量b类型的*string这将得到零值nil。并创建一个变量c类型的string,并用值初始化它"bar"。然后获取地址c并将其存储在指针变量中b。现在,如果您修改指向的值b,这将“同时”修改变量的值c因为b指着c(或者更准确地说b存储内存地址在哪里c是)。因此,如果在此之后您执行以下操作:

*b = "world"

然后打印两者的值c and *b,两者都将是"world":

fmt.Println(c, *b) // Prints "world world" 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go指针第一次赋值 的相关文章

随机推荐

  • C# 无法使“notnull”类型可为空

    我正在尝试创建一个类似于 Rust 的类型Result或哈斯克尔的Either到目前为止我已经做到了 public struct Result
  • 调用未定义函数 odbc_connect() php 7

    我正在测试 php 7 并遇到此错误 致命错误 未捕获错误 调用未定义的函数 odbc connect 从文档页面 http php net manual en function odbc connect php http php net
  • 终止挂起查询(事务中空闲)

    我正在使用带有 Crane Postgres 选项的 Heroku 当我的本地计算机崩溃时 我正在从本地计算机对数据库运行查询 如果我跑 select from pg stat activity 其中一个条目有
  • 在 Xcode 4 中添加框架 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Xcode 4 中 添加现有框架 https stackoverflow com questions 3352664 how to add existing frameworks in xco
  • 如何同步对具有 didSet 的属性的访问?

    如何同步使用 didSet 的属性的访问 使用 GCD 或 objc sync enter 我有一处房产 有一个房产观察员 如何使用私有队列来同步属性的获取 设置 var state State disconnected Q How to
  • PHP 中类的默认可见性是多少?

    我可以在中找到属性和方法的默认可见性PHP手册 https secure php net manual en language oop5 visibility php 但我找不到有关课程本身的任何信息 我的猜测是它是公开的 但如果有人可以链
  • 如何在 Android 中写入 SD 卡上的文件夹?

    我使用以下代码从服务器下载文件 然后将其写入 SD 卡的根目录 一切正常 package com downloader import java io File import java io FileOutputStream import j
  • 用于匹配大括号的 IntelliJ IDEA 快捷键映射

    在 IntelliJ IDEA 中导航到匹配大括号的键盘映射是什么 public void blah If 是我的光标 我想用这个键盘映射跳到右大括号 我只用 IntelliJ 9 验证了这一点 但是 在 Windows 上 Ctrl wi
  • 将 GitHub 分叉到 AzureDevOps?

    这篇2014年的帖子 http www woodcp com 2014 01 how to fork git repositories on visual studio online 表示没有对从 GitHub 分叉到 AzureDevOp
  • matplotlib 中的 Latex 渲染错误

    使用 python 2 7 12 在 Ubuntu 16 04 上 和 matplotlib 1 5 2 以下代码渲染不正确 from matplotlib pyplot import plot 1 2 1 1 xlabel r beta
  • Python。如何优化搜索功能

    有什么办法可以优化这两个功能吗 第一个功能 def searchList list element for i in range 0 len list if list i element return True return False 第
  • Mockito - void 函数上的 thenCallRealMethod()

    我在尝试编写 JUnit 测试用例时遇到了问题 而且对 Mockito 还比较陌生 我有一个正在嘲笑的类的函数 该函数恰好是 void 返回类型 当从我的模拟类调用此函数时 我的理解 和调试经验 是它不会调用原始函数 为了克服这个问题 我尝
  • pythonanywhere - 如何使用 websockets 按照 web2py 消息传递示例传输消息?

    因此 我构建了一个应用程序来使用 web2py 和 pythonanywhere 测试 websockets 并且它可以在本地工作 但是当上传到 pythonanywhere 时它不起作用 我认为原因是我正在将内容发送到本地主机 127 0
  • Google Play 游戏功能徽章在 Google Play 上不可见

    我成功地将 Google Play 服务集成到我的 Android 应用程序中 并添加了成就和排行榜 但发布已经几天了 但我在 Google Play 上看不到它的徽章 我需要向 AndroidManifest xml 添加什么内容吗 这些
  • Java util zip 创建“损坏”的 zip 文件

    我正在压缩目录的内容 但在尝试打开压缩文件时遇到错误 谁能告诉我的代码发生了什么 也许我没有分配足够的字节 查看 zipDirectory 内部 您会看到我正在压缩包含特殊扩展文件的文件夹 不确定错误发生在哪里 所以也许有人可以帮助我 非常
  • 使用 MongoDB 进行 Elastic Beanstalk 部署

    非常感谢有关如何通过以下堆栈正确部署 Elastic Beanstalk 的资源建议 MongoDB 导轨 美洲狮 Sidekiq Redis 弹性搜索 我需要在 ebextension 文件中设置所有这些内容吗 或者是在 AWS 中手动设
  • 给定音频流,查找门何时关上(声压级计算?)

    与拍手探测器没什么不同 拍手 拍手鼓掌拍手吧 拍手鼓掌拍手 拍手 拍板 拍手鼓掌 我需要检测门何时关闭 这是在车辆中 这比房间或家庭门更容易 Listen http ubasics com so van driver door openin
  • 这不是尾递归风格的代码吗?

    我对 Scala 有点陌生 在阅读 David Pollack 的 Begining Scala 时尝试了它 他定义了一个简单的递归函数 从文件中加载所有字符串 def allStrings expr gt String List Stri
  • Android Volley,JsonObjectRequest 但接收 JsonArray

    所以我正在使用JsonObjectRequest发送一个JsonObject到休息电话 但它返回JsonArray而不是一个JsonObject 它给了我一个错误 说它无法解析来自JsonObjectRequest 但如果我使用JsonAr
  • Go指针第一次赋值

    当我在玩弄闭包时 我偶然发现了这种行为 我无法理解它 此代码片段的工作原理 func main var a string foo var b string var c string bar b c fmt Printf s s n a b