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"
}

私の目標は、関数を呼び出して文字列の値を変更することです。2 番目の関数では正常に機能しますが、最初の関数では機能しません。

*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 に答える