1

考虑以下程序(http://play.golang.org/p/IbAstvudtE):

package main

import (
    "fmt"
)

func changeStringValueNotOK(dest *string, src string) {
    dest = &src
}

func changeStringValueOK(dest *string, src string) {
    *dest = src
}

func main() {

    a := "Hello"
    b := "World"

    changeStringValueNotOK(&a, b)
    fmt.Println(a) // still "Hello"

    changeStringValueOK(&a, b)
    fmt.Println(a) // now "World"
}

我的目标是调用一个函数并更改字符串的值。与第二个功能一起工作正常,但不适用于第一个。

问题:*dest = src比较是什么意思dest = &src?我猜前者是“dest 的内容现在是 src”,后者是“更改 dest 变量,使其现在指向 src 的地址”,它丢弃了以前的值,而不是 a 的内容。但即使我是对的,我也不明白它是如何*dest = src工作的。

我希望我的问题不会太模糊。

4

2 回答 2

5
*dest = src

is:将 所指向的值设置为dest中的值src。所以它是有效的。

dest = &src

is:将 的值设置dest为 的地址src。由于 dest 是changeStringValueNotOK更改的形式参数(仅针对指针,而不针对指针对象)仅在本地可见。由于更改后的值并没有真正使用,所以它的总效果是没有操作。

于 2013-08-28T17:20:15.453 回答
4

只是为了帮助以图形方式对其进行可视化,在您的主要功能中,您有以下内容:

  Data          Variables

|  ...  |
 -------
| Hello |<----- <a string>
 -------
| World |<----- <b string>
 -------
|  ...  |

当您为这些函数中的任何一个提供参数时,它变为:

  Data                            Parameters

|  ...  |
 -------
| Hello |<----- <a string> <----- <dest *string>
 -------
| World |<----------------------- <src string>
 -------
|  ...  |

在这种情况下,当你这样做时*dest = src,你会得到:

  Data                           Parameters

|  ...  |
 -------
| Hello |    ,- <a string> <---- <dest *string>
 -------    |
| World |<--/      
|       |<---------------------- <src string>
 -------
|  ...  |

请注意,这有效地改变了a自身,因此当您返回先前的范围时,您将观察到更改。

另一方面,如果你这样做dest = &src,你会得到:

  Data                           Parameters

|  ...  |
 -------
| Hello |                        <dest *string> ----,
 -------                                            |
| World |<---------------------- <src string>  <---/
 -------
|  ...  |

这不能解决您的问题,因为 dest 和 src 都是它们所在函数的本地。

附带说明一下,这种参数传递是一种常见的 C 习惯用法,但在 Go 中,您通常会通过返回新值来更改此类字符串。

于 2013-08-28T19:01:41.577 回答