Go言語のプログラミングで使用する基本的な文法についてまとめました。
今回は関数・メソッドについて調べました
関数の定義
1 2 3 4 5 6 7 8 9 10 11 12 |
// 基本的な関数の定義 // func 関数名(引数名 型) 返り値の型 func Myadd(x,y int) int{ a: x + y return a } //引数、返り値なしの場合 func Hello() { fmt.Println("Hello World") return } |
関数の定義方法の書式は下記のようになります。
1 2 3 4 |
func 関数名(引数名 引数の型) 返り値の型{ 関数の処理 return 返り値 } |
返り値や引数がない場合は、それらを省略することもできます。逆に引数や返り値を複数取ることもできます。
1 2 3 4 |
func 関数名(引数1 引数1の型, 引数2 引数2の型)(返り値1の型, 返り値2の型){ return 返り値1, 返り値2 } |
またGo言語では返り値の部分に変数を割り当て、プログラムを一部省略して書くことができます。次に書く関数は書き方が少し異なりますが、同じ処理を行っています。
1 2 3 4 5 6 7 8 9 10 11 |
//一般的な書き方 func hello()(string){ s := "Hello World" return s } //省略による書き方 func hello()(s string){ //返り値用の変数 Sを宣言している s = "Hello World" return //return に s を指定しなくてもよい } |
返り値の受け取りと破棄
関数から返り値を受け取る方法はC言語とほぼ同じ方法で行えます。またGo言語では関数の返り値をすべて受け取る必要はなく、不要なものは破棄することができます。
1 2 3 4 5 6 7 8 9 10 11 |
func mytest()(x, y int){ x = 1 y = 2 return } //返り値の受け取り a, b := mytest () //=> a = 1, b = 2 //返り値の破棄 a, _ = mytest() // =>a = 1, 二つ目の返り値は無視 |
lambda式(無名関数)と関数を返す関数
Go言語ではLisp言語で言うところの「lambda式(無名関数)」を使用することができます。これは関数に名前を与えずに定義を行うことができます。またこの機能を利用することで関数を返す関数を定義して、より柔軟な関数を作ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//lambda式による無名関数の定義 fn := func(x int) int{ return x + 1} //無名関数の書式 func(引数 引数の型) 返り値の型 {関数の処理} //関数を返す関数 func myfunc() func() { return func() { fmt.Println("Hello") } } fn := myfunc() fn() //=>Hello //関数を引数にとる関数 func myfunc(fn func()) { fn() } myfunc(func () {fmt.Println("Hello") })() //=> "Hello" |
クロージャ
Go言語ではlambda式を用いて「クロージャ」の機能を利用できます。クロージャは日本語でいうと関数閉包と呼ばれ、関数とそれを囲う環境をセットにしたものです。lambda式の元となったlisp言語で言うところの「Let Over Lambda」です。
Go言語では関数を返す関数を用いて以下のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
func func1() func() int { var i int return func() int { i = i + 1 return i } } func main() { f := func1() fmt.Println(f()) //=> 1 fmt.Println(f()) //=> 2 fmt.Println(f()) //=> 3 } |
関数の終了処理
Go言語では関数の終了時に実行する式を登録しておくことができます。
1 2 3 4 5 6 7 8 |
func test() { defer fmt.Println("end") //終了処理の登録 fmt.Println("test") //通常処理 } test() //=> test //=> end |
メソッド
Go言語にはクラスがありませんので、オブジェクト指向言語でいうところのメソッドはありません。しかしGo言語には構造体と関数を結びつけるためのメソッド機能があります。
1 2 3 4 5 6 7 8 9 10 11 12 |
// メソッドの定義 type test { x int } func (t test)Reader() { fmt.Println(t.x) } str := test{x:1} str.Reader() //=> 1 |
関連記事