Golang
Packages, Valiables and Functions
Packages
- Go のプログラムはパッケージで成り立っている
main
パッケージのmain
関数からプログラムが始まる- パッケージ名はインポートパスの最後の要素と同じ名前である(
math/rand
ならrand
) - 一つのフォルダには一つのパッケージしか含められない(例外は
フォルダ名_test
)。通常はフォルダ名をパッケージ名にする。
Imports
// bad
import "fmt"
import anotherName "math"
import _ "io" // 初期化処理だけ使いたい場合
// good (factored import)
import (
"fmt"
anotherName "math"
import _ "io"
)
Exported names
- 大文字で始まる名前がエクスポートされる
- パッケージをインポートしたとき、エクスポートされた名前のみ参照できる
Functions
- 各引数の後に型を記載する
()
の後に返値の型を記載する
func add(x int, y int) int {
return x + y
}
// 連続する引数が同じタイプなら省略できる
func add(x, y int) int {
return x + y
}
Multiple results
ファンクションは複数の値を返すことができる。
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b) // => world hello
}
Named return values
- 戻り値に名前をつけると、関数の最初で定義した変数として扱われる
- 名前付き戻り値を使い、かつ return に何も書かなかった場合、自動的に名前付き戻り値がリターンされる(naked return)。ただし、長い関数では読みやすさの点から明示的に記載すること。
- 戻り値の意味を表す名前をつけるよう心がけること
func split(sum int) (x, y int) {
x = sum / 2
y = sum - x
return
}
func main() {
a, b := split(20)
fmt.Println(a, b)
}
値渡しと参照渡し
- 関数に引数を渡した場合、値はコピーされる。つまり、呼び出し元の変数とは別物である。
- 下記の場合、
i
はmyInt
のコピーであり、p
はmyPointer
のコピーである。
func test(i int, p *int) {}
func main() {
myInt := 123
myPointer := &myInt
test(myInt, myPointer)
}
可変長パラメータ
- 最後の引数に限って、
...
をつけることで可変長のパラメータとして受け取れる - 受け取ったパラメータはスライスとして扱われる。
// c の型は []string になる
func someFunc(a int, b int, c ...string){}
関数リテラル
- 匿名関数(クロージャ)を作るときに使う