Go言語学習ノート(六)方法と受信機

2040 ワード

C++はオブジェクト向けのプログラミング言語であり、クラスにメンバー変数とメンバーメソッドを提供することができます.Goにはクラスの概念はありませんが、似たようなメカニズムを提供しています.それが方法です.
Go言語のメソッド(method)は、特定のタイプの変数に作用する関数です.この特定のタイプの変数を受信機(receiver)と呼ぶ.特定のタイプを構造体またはクラスと理解すると、受信機の概念は他の言語のthisまたはselfに類似する.
Go言語では、受信機のタイプは、構造体だけでなく、どのタイプでもメソッドを持つことができますが、typeで定義されたタイプでなければなりません.
1.受信機--メソッドが作用するターゲット
(1)受信機のフォーマット
func (           )    (    ) (    ){
   //   
}

 
    :
package main
import "fmt"

type Bag struct {
    items []int
}


//    
func Insert(b *Bag, itemid int) {
    b.items = append(b.items, itemid)
}

//      
func (b *Bag)Insert_method(itemid int) {
    b.items = append(b.items, itemid)
}

func main() {

   b := new(Bag)
   Insert(b, 12)
   Insert(b, 13)
   Insert(b, 14)
   Insert(b, 15)

   fmt.Printf("%+v
", b) b.Insert_method(1111) b.Insert_method(1113) b.Insert_method(1115) b.Insert_method(1117) fmt.Printf("%+v
", b) }

2.受信機タイプ
受信機のタイプは、ポインタ受信機と非ポインタ受信機に分けられる.2つの受信機は、使用時に異なる効果を生じます.効果に応じて、2つの受信機は、異なるパフォーマンスおよび機能要件のコードに使用されます.
(1)ポインタタイプ受信機
ポインタタイプの受信機は、オブジェクト向けthisまたはselfに近い構造体のポインタからなる.
ポインタの特性上、メソッドを呼び出す場合、受信機ポインタの任意のメンバー変数を変更し、メソッドが終了した後、変更は有効です.、
(2)ポインタタイプ以外の受信機
メソッドがポインタ以外の受信機に作用すると、Go言語はコード実行時に受信機の値をコピーします.ポインタ以外の受信機のメソッドでは、受信機のメンバー値を取得できますが、変更後は無効です.
(3)ポインタと非ポインタタイプ受信機の使用
コンピュータでは、値のコピーが速いため、ポインタ以外の受信機を使用するのに適しています.大きなオブジェクトはレプリケーション性能が低いため、ポインタ受信機を使用するのに適しており、受信機とパラメータ間の転送時にレプリケーションを行わず、ポインタのみを転送します.
3.メソッドと関数の統一呼び出し
一般関数または構造体のメソッドにかかわらず、それらの署名が一致する限り、それらの署名と一致する関数変数は、一般関数または構造体メソッドを保存することができる.
package main

import "fmt"

type class struct {

}

func (c *class) Do(v int) {
    fmt.Println("call method do:", v)
}

func funcDo(v int) {
    fmt.Println("call function do:", v)
}

func main() {
    var delegate func(int)  //        ,        ,     

    c := new(class)

    delegate = c.Do

    delegate(100)

    delegate = funcDo

    delegate(100)
}