プロジェクトによって色々な言語を使うことが増えてくると、パッと切り替えられず混乱してしまうことがあります。そんな自分用の備忘録です。
Go言語のプレイグラウンドはこちら。
特徴
- コンパイル言語であるため、Pythonなどの動的言語に比べ実行速度が圧倒的に速い。
- Goのプログラムが起動した直後には「main」パッケージに属する「main関数」が実行されるため、必ず「main関数」が必要。
処理の書き方
処理の最後に;
は不要です。
println("hoge")
変数
var
で定義し、データ型が変数名の後ろになります。
Goでは、データ型の指定を省略することが可能です。
次の3行は全て同じ意味になります。
var a int = 1
var a = 1
a := 1
#メソッド名や変数名の大文字/小文字
名前(トップレベルの型名、関数名、メソッド名、定数名、変数名、構造体のフィールドおよびメソッド名)の先頭一文字が大文字になっていれば、パッケージの利用者側から参照可能となります。すなわち大文字にしなければ、それが定義されているパッケージ内からしか参照できません。
標準出力
println
だけでも出力できますが、扱えるデータ型が多いためfmt
パッケージをインポートして使うことの方が多いようです。
import (
"fmt"
)
// メソッドの中で
println("hoge") //fmtを使わない場合
fmt.Println("hoge")
fmt.Printf
を使用すると、フォーマットを指定して出力します。次の例のように文字列の中に%s
を埋め込むことで、文字列を埋め込むこともできます。数字の場合は%d
を使います。
なお、Printf
の場合は出力の最後が改行されません。
import (
"fmt"
)
// メソッドの中で
fmt.Printf("%s world", "Hello")
//出力結果
Hello world
1を足して代入、1を引いて代入
省略系が用意されていて、1行目と2行目、4行目と5行目は同じ意味になります。
n = n+1
n++
n = n-1
n--
if文
条件を()で囲まない書き方になります。
また、左右の値が等しいかどうかは==
で判定します。
if i == 10 {
//iが10と等しい場合に実行する処理
}
if y != 10 {
//iが10と等しくない場合に実行する処理
}
for文
条件の部分は()不要。初期値の定義は必ず:=
を使います。
package main
import (
"fmt"
)
func main() {
//初期値; 条件式; 増減値
for i := 1; i <= 5; i++ {
fmt.Println(i)
}
}
//出力結果
1
2
3
4
5
関数の呼び出し
関数名()
で呼び出すことができます。
package main
import (
"fmt"
)
func main() {
//関数の呼び出し
hoge()
}
//関数の定義
func hoge() {
fmt.Println("hoge")
}
引数の渡し方
引数を受け取る関数の場合は、引数名
データ型
の順で指定します。
package main
import (
"fmt"
)
func main() {
//関数の呼び出し
hello("takashi")
}
//引数名 データ型
func hello(name string) {
fmt.Printf("Hello, %s", name)
}
戻り値の返し方
戻り値は呼び出し元で変数に代入できる。初期化も兼ねる場合は:=
を使用することに注意です。(=
だとエラーになります)
package main
import (
"fmt"
)
func main() {
//:=で戻り値を変数に代入
aisatsu := hello("takashi")
fmt.Printf(aisatsu)
}
//戻り値のデータ型を指定
func hello(name string) string {
fmt.Printf("Hello, %s\n", name)
return "Bye, yuri"
}
ポインタの利用
Goでは変数が格納されているメモリアドレス空間をポインタを通して扱うことができます。
変数のデータ型の前に*
をつけることでポインタ型の変数を定義できる。stringの場合は*string
、intの場合は*int
となります。
次のように、ポインタを使うことにより、関数を跨いで呼び出し元の変数を直接更新することも可能です。
package main
import (
"fmt"
)
func main() {
name := "yuri"
//ポインタ型の変数を定義して変数nameのアドレスを代入
var namePtr *string = &name
fmt.Println(namePtr)
//ポインタ型の変数を引数に渡して関数を実行
changeName(namePtr)
fmt.Printf("Hello,%s", name)
}
func changeName(namePtr *string) {
//ポインタを使って元の変数を更新
*namePtr = "hana"
}
//出力結果
0x40c138
Hello,hana