A tour of Go
Go入門用の公式チュートリアル
https://tour.golang.org
ブラウザ上で実行できるのでGoインストール等は不要。
Offlineで行う方法もWelcome編に記載されている : https://go-tour-jp.appspot.com/welcome/3
この記事では各チュートリアルで個人的に理解しづらかったものや、普段使用する言語と違った部分をメモとして残します。
Basics
packages, variables & functions
パッケージについて
- 外部パッケージはimportで宣言
- 外部パッケージ内で使用している変数や関数などの名前は、そのパッケージでエクスポートされている場合に使用できる。エクスポートされている名前は先頭が大文字になる。
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println(math.Pi)
}
math.piだと宣言されていないのでエラーになる。
関数について
基本形
func (arg1,arg2...) (return_value) {処理}
引数や戻り値を変数宣言する際は、型宣言は変数の後ろ
package main
import "fmt"
func add(x int, y int) (sum int) {
return x + y
}
func main() {
fmt.Println(add(42, 13))
}
同じ型の場合はまとめて宣言可能
func add(x, y int) (sum int) {
return x + y
}
複数の戻り値も可能
func swap(x, y string) (string, string) {
return y, x
}
戻り値に変数名を与えると、returnの後ろに指定しなくても戻り値を暗黙で指定できる (naked return statement)
短いコードでは有効だが、それ以外では可読性が下がる
func add(x, y int) (sum int) {
sum = x + y
return
}
変数について
型宣言するJavascriptと理解するとよい
var : 変数の宣言
const : 定数の宣言 (後述)
ゼロ値
変数に初期値を与えずに宣言するとゼロ値が与えられる
数値型(int,floatなど): 0
bool型: false
string型: "" (空文字列( empty string ))
初期値の与え方
pythonのようにまとめて代入できる
package main
import "fmt"
var i, j int
func main() {
var c, python, java = true, false, "no!"
fmt.Println(i, j, c, python, java)
}
暗黙的な型宣言
関数の中では varの代わりに := を用いて型宣言せずに変数宣言ができる
func main() {
c, python, java := true, false, "no!"
fmt.Println(c, python, java)
}
型変換
変数vを型Tに変換する : T(v)
GoはC言語と異なり、型変換は明示的に変換しないとエラーになる
package main
import (
"fmt"
)
func main() {
var x, y int = 3, 4
f := float64(x) + 0.5
y += 1
fmt.Println(x, y, f)
}
定数
character, string, boolean, numericのみ
定数は暗黙的宣言 (:=) はできない
数値の定数は高精度な値であり、型が指定されない場合、状況に応じて必要な型を取る
package main
import "fmt"
const (
// Create a huge number by shifting a 1 bit left 100 places.
// In other words, the binary number that is 1 followed by 100 zeroes.
Big = 1 << 100
// Shift it right again 99 places, so we end up with 1<<1, or 2.
Small = Big >> 99
)
func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
return x * 0.1
}
func main() {
fmt.Println(needInt(Small)) -> 0.2
fmt.Println(needFloat(Big)) -> 1.2676506002282295e+29
}
SmallもBigもintかfloatか決まっていないが、それぞれ関数で要求されているデータ型にマッチするように型を取っている。