はじめに
前回は環境構築的なことしか行ってなかったので、今回は文法的なことをやっていこうと思います
環境

実行とビルド
package main
import "fmt"
func main() {
fmt.Println("HelloWorld")
}
実行
go run hello_world.go
まぁ普通にHelloWorld
と出力されます
ビルド
go build hello_world.go
hello_worldというUNIX実行ファイルが同ディレクトリにできました
そして以下のコマンドで実行できます
./hello_world
実行するとHelloWorldと出力されます
なんかJavaのjavac
コマンドを思い出しました
ぶっちゃけ今のところ go run
で実行するのとgo build
でビルドしてから実行することの利点がイマイチわかっていません(追々理解していこうと思います)
基本文法
package main
import "fmt"
func main() {
//宣言
var num int
var str string
num = 0
str = "hoge"
fmt.Println(num, str)
//変数初期化
var num2 = 1
num3 := 2
var str2 = "go"
//定数初期化
const num4 = 3
fmt.Printf("num2:%d num3:%d num4:%d str2:%s\n", num2, num3, num4 ,str2)
}
0 hoge
num2:1 num3:2 num4:3str2:go
変数は var
で定数はconst
なんかjavascriptっぽい気がする
今までやってきた言語はC, Java, Pythonですがまあ少し違うくらいでしたですがnum3 := 2
は初めてみました
定数では :=
を使用することができません
Why fmt?
出力するのは謎のfmt
というパッケージからPrint関数を呼び出して出力します
公式ドキュメントより
Package fmt implements formatted I/O with functions analogous to C's
printf and scanf. The format 'verbs' are derived from C's but are
simpler.
ざっくり言うと
C言語に似たprintf
やscanf
といった関数を持っていて、 C言語から派生しているが単純化されている
ちなみにドキュメントはgodoc
と言うドキュメント閲覧ツールを使用して見ました
go get golang.org/x/tools/cmd/godoc
godoc fmt
godocに続けてパッケージ名を入力するとそのドキュメントが閲覧できます
型の種類
- 真偽値型
- 数値型
- 文字列型
- 構造体型
- ポインタ型
- マップ型
- 関数型
- チャンネル型
- スライス型
C言語で挫折したポインタがあるだとΣ( ̄ロ ̄''lll)
構造体も懐かしいC言語でやった記憶がある(覚えているとはいっていない)
チャンネル型とスライス型はなんだ?とりあえず公式チュートリアルの途中なので今回はパスします
パッケージのインポートと関数
package main
import (
"fmt"
"math"
)
func showPi() {
fmt.Println(math.Pi)
}
func add(x int, y int) int {
return x + y
}
func main() {
showPi()
fmt.Println(add(4, 12))
}
複数のパッケージをインポートする際はimport
後ろに()
内に記述します
引数のない関数showPi
はmain関数
とそんなにからわない印象でした
引数と戻り値のある関数 add
はパッと見た感じC言語の戻り値の型を後ろに移動した感じかなと思いました
複数の戻り値
package main
import (
"fmt"
)
func change(x, y string) (string, string) {
return y, x
}
func main() {
a, b := change("Hello", "World")
fmt.Println(a, b)
}
関数の引数が2つ以上で型が同じなら (x, y string)
と省略できる
(string string)
で戻り値も複数返せます
naked return
func hanbun(num int) (x, y int) {
x = num / 2
y = num % 2
return
}
func main() {
fmt.Println(hanbun(5))
a, b := hanbun(8)
fmt.Println(a, b)
}
2 1
4 0
戻り値に変数名をつけることでreturn
の後にリターンステートメントを付けずに戻り値を返すことができます
これをnaked return
と呼ぶそうですnakedの意味が裸、ありのまま、露骨のような意味があるようなのですがnaked return
の意味はよくわかりません