関数
関数とはひとまとまりの処理に名前を付けて、何度も呼び出せるようにしたもの。
func 関数名(){処理の中身}で定義できる。関数を呼び出すときは関数名()で呼び出すことができる。
引数を使用する場合は、関数名のあとの()に引数の名前と引数のデータ型を入れる。
※引数とは、関数を呼び出す際に関数に渡す値のこと。
add関数を定義してみると
func add(int x, int y){
fmt.Println(x + y)
}
func main() {
add(10,20)
}
//x + yの合計が出力されるadd関数を定義し、main関数の中でadd関数を呼び出している。ここでは引数がxは10,yは20なので30が出力される。
返り値を返す関数の定義
返り値とは、関数が返す値のこと。引数の()のあとに返りのデータ型を指定し、returnで値を呼び出し元に返す。
func add(int x, int y) int {
return x + y
}
func main () {
r := add(10,20) //返り値を変数rに代入している
fmt.Println(r)
}
//30が出力される
返り値に名前を付けたいときは引数の()のあとに(返り値名 返り値のデータ型)という形で定義する。以下は返り値にint型のresultという名前を付けたcul関数
func cal(price, item int)(result int){
result = price*item
return result //resultを省略することも可能
}
func main () {
r := cal(100,2)
fmt.Println(r)
}
//200が出力される
関数リテラル
関数は変数に入れることもできる。以下のコードでは、main関数内で関数を定義して変数fに代入している。変数に代入した関数は変数名()で呼び出すことができる。
func main () {
f := func(x int){
fmt.Println("innner func", x)
}
f(1)
}
//inner func 1 と出力される
funcのあとに関数名を入れるのが一般的だが上記は名前がない。このような関数を関数リテラル、という(ほかの言語ではラムダ式や無名関数という)
また、関数リテラルは変数に代入せずにそのまま実行することもできる。このとき、関数の範囲を表す{}のあとに()を入れて(引数がある場合は引数も入れる)実行させることができる
func main () {
func(x int){
fmt.Println("innner func", x)
}(1)
}
//inner func 1 と出力される
クロージャーについて
関数リテラルは、同じ関数の中で宣言された変数にアクセスすることができる。この仕組みをクロージャーという。
以下のコードは、main関数内で変数xを宣言し、そこにincrementに代入した関数がアクセスしている。
func main () {
x := 0
increment := func () int {
x++
return x
}
fmt.Println(increment())
fmt.Println(increment())
fmt.Println(increment())
}
//
1
2
3
と出力される
関数を返り値にする
返り値で関数を返す関数も定義することができる。returnで関数リテラルを返り値として、呼び出しもとに渡すことができる。以下のコードは、returnの後ろにあるfunc() intを返している。
main関数では、incrementGenerator()を変数counterに代入している。counter()で代入した関数を呼び出している。
func incrementGenerator() func() int {
x := 0
return func() int {
x++
return x
}
}
func main () {
counter := incrementGenerator()
fmt.Println(counter())
fmt.Println(counter())
fmt.Println(counter())
}
//
1
2
3
と出力される
学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP
・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897