2017-01-16 8 views
-1

すると、次のコードを実行する場合:ポインタが変数のときにポインタのメソッドが動作するのはなぜですか?

package main 

import (
    "fmt" 
) 

type Bar struct { 
    name string 
} 

func (foo Bar) testFunc() { 
    fmt.Println(foo.name) 
} 

func doTest(pointer *Bar) { 
    pointer.testFunc() // run `testFunc` on the pointer (even though it expects a value of type `Bar`, not `*Bar`) 
} 

func main() { 
    var baz Bar = Bar{ 
     name: "Johnny Appleseed", 
    } 

    doTest(&baz) // send a pointer of `baz` to `doTest()` 
} 

出力読み取り:Johnny Appleseed。私はポインタ上でtestFunc()を呼び出す際にエラーが発生したと思っていたでしょう。

その後、私は&baz.testFunc()doTest(&baz)を切り替えてみました。それから私は、エラーを受け取った:baz.testFunc()を呼び出す代わりに、直接の別の機能を通じてとき

tmp/sandbox667065035/main.go:24: baz.testFunc() used as value 

なぜ私はエラーが出るのですか? doTest(&baz)&baz.testFunc()は全く同じことをしません。doTest(pointer *Bar)は単にpointer.testFunc()を呼び出しますか?

Playground 1 (doTest(&baz))

Playground 2 (&baz.testFunc())

+0

Goは(ドット)の呼び出しでデリファレンス自動ポインタを持っているように動作

(&baz).testFunc() 

。 – saarrrr

答えて

2

あなたが結果のアドレスを取るので、それはので、2行目method values

As with selectors, a reference to a non-interface method with a value receiver using a pointer will automatically dereference that pointer: pt.Mv is equivalent to (*pt).Mv.

の自動derefencing、あなたはこのエラーを持っていますのtestFuncではなく任意の値を返します。あなたがしようとした何 は次のとおりです。期待

関連する問題