次のコラムでは、Golang チュートリアル コラムから Go 言語のメソッドの理解を紹介します。
メソッドは、特別な受信機パラメーターを持つメソッドです。つまり、func とメソッド名の間のメソッド レシーバーです。
func (s Student) GetName() string { return s.name}func (s *Student) SetName(name string) { s.name = name}
レシーバーの型がポインターであるメンバー メソッドはポインター メソッドと呼ばれ、レシーバーの型が非ポインターであるメンバー メソッドは値メソッドと呼ばれます。
オブジェクトを変更する必要がある場合は、ポインター (参照渡し) を使用する必要があります。それ以外の場合は、型をリテラル (値渡し) として宣言するだけです。また、メソッド呼び出しごとに値をコピーすることも避けてください。
type Integer intfunc (a *Integer) Increase(i Integer) { *a = *a + i}func main() { var a Integer = 2 var b Integer = 2 //a.Increase(b) //(&a).Increase(b) (*Integer).Increase(&a, b) fmt.Println(a)}
このメソッドは Integer クラスに属していませんが、Integer を指すポインター型に属しています。メソッドを呼び出すときに、インスタンス上で Increase メソッドを直接呼び出すことができるのは、Go 言語がコンパイル フェーズでは、 a が対応するポインター型 &a
に自動的に変換されるため、実際の呼び出しコードは (&a).Increase(b)
になります。
type A struct { name string}func (a A) Name() string { a.name = "Hi! " + a.name return a.name}func main() { a := A{name: "test"} fmt.Println(a.Name()) fmt.Println(A.Name(a))}
a.Name()
は実際には A.Name(a)## の構文です# Sugar、変数 a はいわゆるメソッド レシーバーです。
func NameOfA(a A) string { a.name = "Hi! " + a.name return a.name}func main() { t1 := reflect.TypeOf(A.Name) t2 := reflect.TypeOf(NameOfA) fmt.Println(t1 == t2)// true}Go 言語の関数型はパラメーターと戻り値にのみ関連するため、これら 2 つの型が等しいことにより、
メソッドが本質的に通常の関数であり、レシーバーが暗黙的な関数であることが証明されます。最初のパラメータ。
以上がGo言語でのメソッドの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。