Golang中a与b的关系探讨及代码实例分享

Golang中a与b的关系探讨及代码实例分享 https://play.golang.org/p/jihZRiYy8bO

在这段代码(以及其他代码)中,我试图理解“a”与“b”之间的关系

10 回复

绝佳的解释!!!
非常感谢!!!

更多关于Golang中a与b的关系探讨及代码实例分享的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是指针的内容。它表示指针所指向的内存地址…

情况变得越来越清晰

明白了!谢谢!保存这个

为什么这让我如此兴奋!

以下问题与上述内容的关系在于,这两段代码都包含在托德·麦克劳德关于指针的课程主题中。
https://play.golang.org/p/RvznxHr_tda
这是什么?“0x20818a220”

我同意Yamil的观点。这是一个精彩而详细的解释,就像你一直以来给予我的所有帮助一样。非常感谢。我会把它保存到文件中,这样就能"永久"保留 😉

你关于地址与内存区别的说法很有趣。我需要多次研读这些信息,而且我绝对认为它值得我这样做。再次感谢,很高兴再次收到你的回复。

在那个例子中,看起来Todd是在展示Go语言中函数参数是通过值传递的。

这正是他所说的。

函数只能修改自己的副本,而不能修改位于 main() 中的变量 x

实际上我很确定他也说过这一点。

如果你希望 foo() 修改 x,那么你可以将 x 的指针传递给函数,然后让该函数对指针进行操作。我修改了程序来展示如何实现:

package main

import "fmt"

func foo(y *int) {
    *y = *y + 1
}

func main() {
    x := 2
    fmt.Println("x =", x)
    foo(&x)
    fmt.Println("x after foo =", x)
}

非常酷!

非常感谢!

“查看表格中的内存地址 1004,这里存储着变量 b 的值。该地址本身也有地址,因此你甚至可以获取它的指针。你可以看到这个地址存储在内存地址 1007 处,我将其命名为 d。(这个过程几乎可以无限进行下去)”
(我不记得在论坛中正确显示引用的方式)
我注意到您将 10041007 都描述为内存地址。我对这两者的区别不太清楚。

Todd McLeod 在这节课后紧接着推出了另一节名为《何时使用指针》的课程。他首先提出:* 第一步 不使用指针: https://play.golang.org/p/lxsWkhTaYv
看起来在这段代码中,计算机"执行"(由于缺乏更合适的词,或者这就是正确术语?)的顺序是先第14行,然后是第16行,最后是第10行。我的理解正确吗?如果正确的话,我想知道为什么计算机不按顺序执行这些代码行。

嗨 Cherolyn,

我说的"内存位置1004",只是想用另一种方式表达"地址1004处的数据(或内存)"。如果以后我要正式写这个内容,我需要确定具体使用什么词汇,并仔细解释它们。

关于示例代码,请注意在main()开始执行后,调用了foo()函数。执行权转移到foo()函数,其中第14行和第16行的fmt.Println()按顺序执行。在foo()结束时,执行权返回到main()的第10行,那里的fmt.Println()被执行。

这就是函数的工作原理。在其他语言中,它们被称为子程序过程,在机器码层面,CPU指令集有"跳转到子程序"指令来实现这个功能。

在那个例子中,看起来Todd展示的是在Go中,函数参数是通过值传递的。这意味着foo()处理的是传递给它的变量的副本,只能修改自己的副本,而不能修改main()中的变量x

如果你想让foo()修改x,那么你可以传递一个指向x的指针给函数,然后让该函数操作这个指针。我修改了程序来展示如何实现:

func main() {
    fmt.Println("hello world")
}

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

在您提供的代码示例中,变量 ab 之间存在赋值关系。具体来说,b 的值是通过对 a 进行取地址操作(使用 & 运算符)得到的,因此 b 是指向 a 的指针。这意味着对 b 的修改会直接影响 a 的值,因为它们共享同一内存地址。

以下是代码的详细解释和示例:

package main

import "fmt"

func main() {
    a := 42
    b := &a  // b 是指向 a 的指针

    fmt.Println("a 的值:", a)     // 输出: a 的值: 42
    fmt.Println("b 的值:", b)     // 输出: b 的值: 0x1040a124(某个内存地址)
    fmt.Println("通过 b 访问 a 的值:", *b) // 输出: 通过 b 访问 a 的值: 42

    // 通过 b 修改 a 的值
    *b = 100
    fmt.Println("修改后 a 的值:", a) // 输出: 修改后 a 的值: 100
}

在这个例子中:

  • a 是一个整数变量,初始值为 42。
  • b 被赋值为 &a,即 a 的内存地址,因此 b 是一个指向 a 的指针。
  • 使用 *b 可以解引用指针,访问或修改 a 的值。
  • 当通过 *b = 100 修改值时,a 的值也变为 100,因为它们指向同一内存位置。

这种关系在 Go 中常用于函数间传递引用以避免数据复制,或在需要修改原始变量时使用。如果您有更多上下文或特定代码,我可以进一步分析。

回到顶部