Go/メソッドとインターフェース

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go
ナビゲーションに移動 検索に移動

メソッド[編集]

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 = レシーバ変数.メソッド()

みたいな記述がコード中のどこかにあるコーディングをする事になるでしょう。

インターフェース[編集]

この節は書きかけです。この節を編集してくれる方を心からお待ちしています。