Pointers 字符串指针
考虑以下程序(): 我的目标是调用函数并更改字符串的值。可以使用第二个函数,但不能使用第一个函数 问题:与Pointers 字符串指针,pointers,go,Pointers,Go,考虑以下程序(): 我的目标是调用函数并更改字符串的值。可以使用第二个函数,但不能使用第一个函数 问题:与dest=&src相比,*dest=src的含义是什么?我猜前者是“dest的内容现在是src”,后者是“更改dest变量,使其现在指向src的地址”,它丢弃了前面的值,但不是a的内容。但即使我是对的,我也不明白*dest=src是如何工作的 我希望我的问题不要太模糊 *dest = src is:将dest指向的值设置为src中的值。所以它是有效的 dest = &src is
dest=&src
相比,*dest=src
的含义是什么?我猜前者是“dest的内容现在是src”,后者是“更改dest变量,使其现在指向src的地址”,它丢弃了前面的值,但不是a的内容。但即使我是对的,我也不明白*dest=src
是如何工作的
我希望我的问题不要太模糊
*dest = src
is:将dest
指向的值设置为src
中的值。所以它是有效的
dest = &src
is:将dest
的值设置为src
的地址。由于dest是changeStringValueNotOK
的一个形式参数,因此更改(仅针对指针,而非指针对象)仅在本地可见。由于未真正使用更改的值,因此其总体效果是“无”操作
is:将dest
指向的值设置为src
中的值。所以它是有效的
dest = &src
is:将
dest
的值设置为src
的地址。由于dest是changeStringValueNotOK
的一个形式参数,因此更改(仅针对指针,而非指针对象)仅在本地可见。由于未真正使用更改的值,因此其总体效果为“无操作”。为了帮助以图形方式将其可视化,在您的主要功能中,您有以下功能:
Data Variables
| ... |
-------
| Hello |<----- <a string>
-------
| World |<----- <b string>
-------
| ... |
请注意,这会有效地更改a
本身,因此当您返回到前面的范围时,您将观察到更改
另一方面,如果执行dest=&src
,则会得到:
Data Parameters
| ... |
-------
| Hello | <dest *string> ----,
------- |
| World |<---------------------- <src string> <---/
-------
| ... |
数据参数
| ... |
-------
|你好,
------- |
|World |为了帮助以图形化的方式将其可视化,您的主要功能包括:
Data Variables
| ... |
-------
| Hello |<----- <a string>
-------
| World |<----- <b string>
-------
| ... |
请注意,这会有效地更改a
本身,因此当您返回到前面的范围时,您将观察到更改
另一方面,如果执行dest=&src
,则会得到:
Data Parameters
| ... |
-------
| Hello | <dest *string> ----,
------- |
| World |<---------------------- <src string> <---/
-------
| ... |
数据参数
| ... |
-------
|你好,
------- |
|World |第一个实际上是“将dest指向的值设置为src中的值”。我相信你理解它,但是你的措辞让它听起来好像src正在改变。第一个是“将dest指向的值设置为src中的值”。我相信你理解它,但是你的措辞让它听起来像是src正在改变。这不是你的问题,所以就像一些可能不相关的反馈:这种习惯用法在C中很常见,但在Go中实现这一点的习惯用法是返回更改后的值。我在我的命令行选项解析器(foo=bar)中使用它:将参数栏保存在给定(字符串)变量中。虽然使用&此处转到参数,界面看起来有点干净,但我仍然不确定支持什么。谢谢你的反馈!这不是你的问题,正如一些可能不相关的反馈:这种习惯用法在C中很常见,但在Go中实现这一点的惯用方法是返回更改后的值。我在命令行选项解析器(foo=bar)中使用它:将参数栏保存在给定的(string)变量中。虽然使用&此处转到参数,界面看起来有点干净,但我仍然不确定支持什么。谢谢你的反馈!Gustavo,从顶部开始的第三个图形有点误导。
的值更改为World
,因此现在应该有两个World
值。我知道,由于它们是字符串常量,它们将有效地共享相同的内存空间,但这比IMHO更深一层。图表显示了实际发生的情况,因此它比破坏现实的图表更有指导意义。内存中确实有一个由两个字符串变量指向的“世界”
。为了提高清晰度,我重新命名了s/Value/Data/
。
的值更改为World
,因此现在应该有两个World
值。我知道,由于它们是字符串常量,它们将有效地共享相同的内存空间,但这比IMHO更深一层。图表显示了实际发生的情况,因此它比破坏现实的图表更有指导意义。内存中确实有一个由两个字符串变量指向的“世界”
。我重命名了s/Value/Data/
以提高清晰度。