はじめに
先日にアップしたはじめてのGo言語(4. 条件分岐と繰り返し)に続いて、Go言語の基礎を学んだ記録を記事としてまとめてみました。
実行環境
WSL2(Ubuntu 22.04.3 LTS)
引数と戻り値のない関数
- 以下コードでは、引数と戻り値を持たない
printMessage
関数を実行しています。- 戻り値がないことを表現するのに、
void
などのキーワードは必要ないのが意外でした。
- 戻り値がないことを表現するのに、
- Rubyなどのスクリプト言語では、呼び出す関数(printMessage)を呼び出し元の関数(main)よりも前に定義する必要がありますが、Go言語ではそのように関数を定義する順番を気にする必要はありません。
func.go
package main
import "fmt"
func main() {
printMessage()
}
// メッセージを表示する。
func printMessage() {
fmt.Println("Hello, world!")
}
実行結果
# go run func.go
Hello, world!
引数と戻り値のある関数
- 以下のコードでは、引数と戻り値を持つ2つの関数を実行しています。
-
calcSquareArea
関数 -
calcTriangleArea
関数
-
- 戻り値のデータ型を引数の後ろに定義する点は、何となくVBAっぽさを感じました。
func2.go
package main
import "fmt"
func main() {
var width int = 5
var height int = 3
var sqArea = calcSquareArea(width, height)
fmt.Printf("幅%d、高さ%dの長方形の面積:%d\n", width, height, sqArea)
var triArea = calcTriangleArea(width, height)
fmt.Printf("幅%d、高さ%dの三角形の面積:%f\n", width, height, triArea)
}
// 四角形の面積を求める。
func calcSquareArea(width int, height int) int {
return width * height;
}
// 三角形の面積を求める。
func calcTriangleArea(width int, height int) float32 {
return float32(width * height) / 2;
}
実行結果
# go run func2.go
幅5、高さ3の長方形の面積:15
幅5、高さ3の三角形の面積:7.500000
可変長引数の関数
- 引数名とデータ型名の間に
...
を入れることで可変長引数として扱われます。
func3.go
package main
import "fmt"
func main() {
var total = sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
fmt.Printf("合計値:%d\n", total)
}
// 引数の合計値を求める。
func sum(numbers ... int) int {
var buff int = 0
for i:=0; i<len(numbers); i++ {
buff += numbers[i]
}
return buff
}
実行結果
# go run func3.go
合計値:55
複数の戻り値を持つ関数
- 戻り値が複数ある時は、
(string, string, string)
のようにカッコで囲んで定義します。 - Rubyのメソッドも戻り値を複数返せる仕様となっていますが、「戻り値のN番目の値が〇〇」というように戻り値の並び順が意味を持ってしまうので、私は複数の戻り値はあまり使いたくないと思っています。
func4.go
package main
import "fmt"
func main() {
var txt1, txt2, txt3 = fooBar()
fmt.Printf("戻り値1:%s、戻り値2:%s、戻り値3:%s\n", txt1, txt2, txt3)
}
func fooBar() (string, string, string) {
return "foo", "bar", "baz"
}
実行結果
# go run func4.go
戻り値1:foo、戻り値2:bar、戻り値3:baz
複数の戻り値を持つ関数(2)
- 複数の戻り値のうち、不要な戻り値についてはブランク変数
_
を使うことができます。- 他の言語ではブランク変数という概念を聞いたことが無かったので、正直なところ使うシーンが思い当たりません...
func5.go
package main
import "fmt"
func main() {
var _, txt2, _ = fooBar()
fmt.Printf("戻り値2:%s\n", txt2)
}
func fooBar() (string, string, string) {
return "foo", "bar", "baz"
}
実行結果
# go run func5.go
戻り値2:bar