English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 基礎トレーニング

Golang 控制文

Golang 関数 & メソッド

Golang 構造体

Golang スライス & 配列

Golang 文字列(String)

Golang ポインタ

Golang インターフェース

Golang 并行

Golang エラ(Error)

Golang その他の雑項

Go 言語のメソッド(Method)

Go言語はメソッドをサポートしています。GoのメソッドはGoの関数に似ていますが、異なる点があります。それは、メソッドには受信者パラメータが含まれていることです。受信者パラメータの助けにより、このメソッドは受信者の属性にアクセスできます。ここでは、受信者は構造体型または非構造体型のいずれでもできます。メソッドをコードで作成する際には、受信者と受信者型は同じパッケージ内に存在する必要があります。また、int、stringなどの組み込み型を含む受信者型が別のパッケージで定義されているメソッドの作成は許可されていません。これを試みると、コンパイラはエラーを投げます。

文法:

func(reciver_name Type) method_name(parameter_list)(return_type){
    // コード
}

ここでは、メソッド内で受信者にアクセスできます。

構造体型受信者のメソッド

Go言語では、受信者が構造体型であるメソッドを定義することができます。以下の例のように、メソッド内でこの受信者にアクセスできます:

package main 
  
import "fmt"
  
//Author 構造体
type author struct { 
    name string 
    branch string 
    particles int
    salary int
} 
  
//受信者のメソッド 
func(a author) show() { 
  
    fmt.Println("著者名: ", a.name) 
    fmt.Println("ブランチ名: ", a.branch) 
    fmt.Println("出版された論文: ", a.particles) 
    fmt.Println("給与: ", a.salary) 
} 
  
func main() { 
  
    //初期値
    //Author構造体
    res := author{ 
        名前: "Sona", 
        ブランチ: "CSE", 
        粒子数: 203, 
        給与:    34000, 
    } 
  
    //メソッドを呼び出します
    res.show() 
}

出力:

著者名: Sona
ブランチ名: CSE
出版された論文:  203
給与:  34000

非構造体型の受信器のメソッド

Go言語では、型とメソッドの定義が同一のパッケージに存在する場合、非構造体型の受信器を作成できます。それらがint、stringなどの異なるパッケージに存在する場合、コンパイラはエラーを投げ出します。なぜなら、それらは異なるパッケージで定義されているからです。

package main 
  
import "fmt"
  
//型定義
type data int
//メソッドを定義します
//非構造体型の受信器 
func (d1 data) multiply(d2 data) data { 
    return d1 * d2 
} 
  
/* 
//このコードを実行しようとすると、
//その場合、コンパイラはエラーを投げ出します 
func(d1 int)multiply(d2 int)int{ 
return d1 * d2 
} 
*/
  
func main() { 
    value1 := data(23) 
    value2 := data(20) 
    res := value1.multiply(value2) 
    fmt.Println("最終結果: ", res) 
}

出力:

最終結果:  460

ポインタ受信器を持つGoメソッド

Go言語では、以下を使用できますポインタ受信器を作成する。ポインタ受信器の助けにより、メソッドで行われる変更が呼び出し元に反映される場合がありますが、これは値受信器では不可能です。

文法:

func (p *Type) method_name(...Type) Type {
    // コード
}
package main 
  
import "fmt"
  
// Author 構造体
type author struct { 
    name string 
    branch string 
    particles int
} 
  
//メソッド、author型の受信者を使用
func (a *author) show(abranch string) { 
    ()*a).branch = abranch 
} 
  
// メイン関数 
func main() { 
  
    //author構造体の初期化
    res := author{ 
        name:   "Sona", 
        branch: "CSE", 
    } 
  
    fmt.Println("著者名: ", res.name) 
    fmt.Println("ブランチ名(前): ", res.branch) 
  
    //ポインタの作成
    p := &res 
  
    //showメソッドを呼び出します
    p.show("ECE") 
    fmt.Println("著者名: ", res.name) 
    fmt.Println("ブランチ名(後): ", res.branch) 
}

出力:

著者名:  Sona
ブランチ名(前):  CSE
著者名:  Sona
ブランチ名(後):  ECE

メソッドはポインタと値を受け取ります

よく知られているように、Goでは、関数が値パラメータを持つ場合、関数はパラメータの値のみを受け取ります。値関数にポインタを渡そうとすると受け取らない、逆も然りです。しかし、Goのメソッドは値とポインタを受け取ることができます。それはポインタまたは値受信者で定義されたかどうかに関わらずです。以下の例を参照してください:

package main 
  
import "fmt"
  
// Author 構造体
type author struct { 
    name   string 
    branch string 
} 
  
//ポインタメソッド
//authorタイプの受信者
func (a *author) show_1(abranch string) { 
    ()*a).branch = abranch 
} 
  
//値メソッド
//作者タイプの受信者 
func (a author) show_2() { 
    a.name = "Gourav"
    fmt.Println("著者名(前): ", a.name) 
} 
  
func main() { 
  
     //初期値
     //作者構造体
    res := author{ 
        name:   "Sona", 
        branch: "CSE", 
    } 
  
    fmt.Println("ブランチ名(前): ", res.branch) 
  
     //show_を呼び出します1メソッド
     //(値メソッド)ポインタを持つ
    res.show_1("ECE") 
    fmt.Println("ブランチ名(後): ", res.branch) 
  
     //show_を呼び出します2メソッド
     //ポインタを持つ(値メソッド)
    (&res).show_2()) 
    fmt.Println("著者名(後): ", res.name) 
}

出力:

ブランチ名(前):  CSE
ブランチ名(後):  ECE
著者名(前):  Gourav
著者名(後):  Sona

メソッドと関数の違い

メソッド関数

受信者を含んでいます。

受信者を含んでいません。

指針と値を受け取ることができます。

指針と値の両方を受け取ることができません。

プログラムでは、同じ名前の異なるタイプのメソッドを定義することができます。

プログラムでは、同じ名前の異なるタイプの関数を定義することは許可されていません。