「Go/メソッドとインターフェース」の版間の差分
Semi-Brace (トーク | 投稿記録) Go 版176949から分割 |
(相違点なし)
|
2021年4月14日 (水) 09:42時点における版
メソッド
JavaScriptなどに
オブジェクト.メソッド()
のように特定の「オブジェクト」なるものに所属する関数としてメソッドというものがあります。
Go言語では、type演算子などを使って、このようなメソッドを作成できます。
メソッドの書式については文章だけで説明しても難しいので、まず先にコード例を提示します。(後述で書式などを説明します。)
- コード例
package main
import (
"fmt"
)
type kou int // 型を定義
func (n kou) tasugo() kou {
// 5を足すだけの処理
return 5 + n
}
func main() {
var n kou
var m kou
n = 7
m = n.tasugo()
fmt.Printf("%d\n", m)
}
- 実行結果
12
- (※ 5+7=12なので)
上記コードの書式を解説すると、下記のようになります。
- 上記コード例の書式など
package main
import (
"fmt"
)
type 型名 型
func (レシーバ変数 型名) メソッド名() 型名 {
return 戻り値
}
func main() {
var n kou
var m kou
// 初期値など
n = 7
m = レシーバ変数.メソッド()
fmt.Printf("%d\n", m)
}
読者には
type 型名 型
というのが冗長に思えるかもしれませんが、しかしGo言語の仕様により、(関数ではなく)メソッドを使う際には、こう書かないと、エラーになります。(たぶん、コンパイラ作成時のいろいろな事情がありますので、気にせず、「こう書くのだ」と覚えてください。)一方、メソッドではなく関数を使うだけなら、このtypeの文は不要です。
さて、最後のほうで「fmt.Printf("%d\n", m)」とありましが、もし、ここを
fmt.Printf("%d\n", n.nibai() )
のように一度にまとめて書いても、エラーになります。
なので、
m = n.nibai() fmt.Printf("%d\n", m)
のように、組み込み関数の外で、メソッドの値を、べつの変数に代入する必要があります。(よそのプログラム言語でも、似たような現象があり、こういう作業を「インスタンス」という。メモリの確保などのコンパイラ内部などの都合により、あらかじめ別の変数に代入するなどの必要がある。)
- レシーバ変数
func (n kou) tasugo() kou {
において、funcの直後の ( ) のなかの変数をレシーバ変数と言います。
つまり、書式は
func (レシーバ変数 型名) メソッド名() 型名 {
です。
本節の冒頭のコード例
func (n kou) tasugo() kou {
では、「n」がレシーバ変数です。
メソッドを呼び出すときの書式は、
レシーバ変数.メソッド()
の書式です。
そして、これを「インスタンス」(メモリ確保などのための事前処理)のために、別の変数(たとえばmなど)に代入する必要があるわけですから、
m = レシーバ変数.メソッド()
みたいな記述がコード中のどこかにあるコーディングをする事になるでしょう。
インターフェース
この節は書きかけです。この節を編集してくれる方を心からお待ちしています。