ホームページ >バックエンド開発 >Golang >Go言語でのメソッドの詳細説明

Go言語でのメソッドの詳細説明

藏色散人
藏色散人転載
2020-08-27 13:29:442790ブラウズ

次のコラムでは、Golang チュートリアル コラムから Go 言語のメソッドの理解を紹介します。

Go言語でのメソッドの詳細説明

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 サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。