English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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言語では、以下を使用できますポインタ受信器を作成する。ポインタ受信器の助けにより、メソッドで行われる変更が呼び出し元に反映される場合がありますが、これは値受信器では不可能です。
文法:
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
メソッド | 関数 |
---|---|
受信者を含んでいます。 | 受信者を含んでいません。 |
指針と値を受け取ることができます。 | 指針と値の両方を受け取ることができません。 |
プログラムでは、同じ名前の異なるタイプのメソッドを定義することができます。 | プログラムでは、同じ名前の異なるタイプの関数を定義することは許可されていません。 |