言語の特徴
最小限の構文
while文やdo/whileはサポートされない危険の回避
ポインタ演算禁止
配列の値コピー例外の排除
try/catch構文がない
→関数の戻り値でエラーハンドラを返すクロスコンパイルのサポート
windowsでmacのバイナリが作れちゃう
go tool dist install -v pkg/runtime
set GOPATH=pwd
set GOOS=linux
set GOARCH=amd64
go install並行処理のサポート
ゴルーチンとチャネルを使って簡単並列処理
基本文法
パッケージ管理システムはない、githubが直接import出来る
import (
"fmt"
"github.com/nabuchi/gosample"
"strings"
)
変数の宣言(型宣言付き)
var hoge string = "hello world"
変数の宣言(型推論)
hoge := "hello world"
forの書き方4種
いつもの
for i := 0; i < 10; i++ {
fmt.Println(i)
}
無限ループ
for {
fmt.Println(i)
}
while風
n := 0
for n < 10 {
fmt.Println(n)
n++
}
Javaの拡張for文みたいな
in Java
for(String s : arr) {
fmt.Println(s)
}
in Go
for i, s:= range arr {
fmt.Println(s)
}
関数
- 引数なし、返り値なし
func hello() {
fmt.Println("hello")
}
func main() {
hello()
}
- 引数あり、返り値なし
func sum(i, j int) {
fmt.Println(i+j)
}
func main() {
sum(1, 2)
}
- 引数あり、返り値あり
func sum(i, j int) int {
fmt.Println(i+j)
}
func main() {
n := sum(1, 2)
fmt.Println(n)
}
- 返り値に複数の値を取れる
エラーを返り値で返す
名前付き戻り値
→戻り値に最初から名前を付けられる無名関数
sum := func(i, j int) {
fmt.Println(i+j)
}
func main() {
sum(1, 2)
}
配列
- 常に固定長
- 関数に渡す場合は値渡し #### スライス
- JavaのListみたいな感じ
- 関数に渡す場合は参照渡しみたいだけど、ちょっと複雑らしい http://jxck.hatenablog.com/entry/golang-slice-internals2
マップ
ポインタ
defer
パニック
Goでも一応例外の機構がある,panic()→defer recover()
型システム
type
構造体
インターフェース
型の埋め込み
型の変換
いいところ
- Cみたいに、実行するサーバーでコンパイル・・・みたいなことをしなくて良い
- バイナリがかなり簡単に作れて、サーバー側にツールのインストールが不要なので、オレオレツールとか、ちょっとしたバッチプログラムとかが書きやすい
- (まだちゃんと見れてないけど)並行処理がやりやすそう
よくないところ
- Javaやってるとジェネリクスがなくて不安
- ループがダサい(rubyのmapとかfindとかselectとか使いたい)
微妙なところ
- Javaに慣れてるから、例外処理はthrowsでまとめて投げて、一番上の処理で例外毎の処理書けた方が嬉しい気がする・・・
- 型推論は嬉しいけど、:=がなんとなく嫌・・・