はじめに
最近Go言語を勉強し始めたので、メモとしてGo言語の特徴をメモしていく
package
Goではソースコードの最初にpackageで名前空間を定義する必要がある
importの際にはこの名前空間でimportする
package main // <- 名前空間
import ("fmt") // <- importするパッケージ
func main() {
//実行したい処理...
}
自作モジュールを読み込みたい場合はGOROOTで指定されたPATHにあるsrcから読み込まれる
GOROOTはgo env GOROOT
で確認ができる
変数
Goでは整数型や実数型、文字列型など他の言語と同じような型を利用する
変数の定義や値の代入は以下のようにvarで定義する
var int32 num // 変数の定義
num = 1000 // 変数の代入
また、変数の定義と代入は同時に行うことができ、その場合は以下のように記載する
定義と代入を同時に行う場合には型の定義を省略することもできる
var int32 num = 1000
var num = 1000 // 型の省略
上記の定義はよりシンプルに利用することができる(短縮変数宣言と呼ぶ)
num := 1000
型のキャストも同様に行うことができる
var num1 int32 = 1000
var num2 int64 = int64(num1)
※ なおGoでは暗黙の型変換がされないので必ず型変換を行う必要がある(他の言語ではint32->int64に変換されるとき型変換をしなくても自動で変換される)
文字列を数値型にキャストすることはできないので、strconv
というパッケージのAtoi
関数やItoa
関数を利用する
また、Goでは宣言した変数は必ず利用する必要がある
利用していない変数があるとエラーが発生する
定数はconst {定数} = {値}
で定義する
_
で定義した変数は利用しないこともできる
制御構文
ifやswitch, forなど他の言語と同じように利用できる
c++
のような書き方はGo言語ではステートメントになっており、演算子ではないため、単体で記載する
配列
以下のように定義する
var arr [ 100 ] int32
or
var arr [ 2 ] int32 { 1, 2 }
配列の要素数は固定になり、最初に定義した数から増やすことはできない
スライス
配列と類似しているが、要素が固定化されておらず、後から操作することができる
初期化は以下のように行う
sli := []int{10, 20, 30}
値を取り出す際には変数 := 配列[開始:終了]
で取り出す
スライスは配列の参照を行なっているだけであり、スライスを変更すると元になった配列も変更される
スライスは変数 = append(スライス, 値1, 値2)
という形式で要素を追加することができ
なお、関数の引数として渡す際などにスライス...
と渡すことでスライスを展開することができる
Map
名前を使って値を管理したい場合に利用する
以下のように初期化する
var m map[string]int
m: 変数
string: キー型
int: 値型
マップは順番を保証しないため、for文などで順に表示した場合実行時に結果が異なる場合がある
関数
以下の形式で記載する
func 関数名(引数) 戻り値 {
実行する処理
}
この部分func 関数名(引数) 戻り値
を関数のシグニチャという
また、戻り値を複数指定することもでき、その場合は以下のように戻り値を括弧でまとめ、returnで返す方はカンマで区切る
func 関数名(引数1, 引数2) (戻り値1, 戻り値2) {
実行する処理
}
----
return 値1, 値2
また、名前付き戻り値を利用でき、戻り値に引数と同様に名前をつけることができる
その場合はreturnで変数を返す必要がなく、returnのみを記述する
func kansu(a int, b int) (s int){
s = a + b
return <- sの値が返される
}
可変長引数も利用でき、その場合は以下のように定義する
func 関数名(変数 ...型) 戻り値 {
}
関数内で読み込む際には変数...
でスライスとして展開して読み込む
※ 可変長引数は最後に利用する必要がある
Goでは関数は値である
そのため、関数を変数に入れて利用することができる
f := func(arr []string) ([]string, string){
return arr[1:], arr[0]
}
引数や戻り値に関数を利用することもでき、そういった関数は"高階関数"と呼ばれる