取り敢えず形だけ(ごめんなさい)。
随時更新します。
環境設定
Macならbrewで入れればいい
$ brew install go
ビルド・実行
クロスコンパイル
基本文法
ポインタ
参考:
Goでxxxのポインタを取っているプログラムはだいたい全部間違っている
標準入力・標準出力
標準入力
Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版を参照
fmt.Scan
var a int
fmt.Scan(&a)
bufio.Scanner
var sc = bufio.NewScanner(os.Stdin)
var line string
if sc.Scan() {
line = sc.Text()
}
標準出力
fmt.Println("Hello world")
関数
無名関数
クロージャ
配列
宣言
var a [5]string
サイズを指定する
初期化
var array [6]int = [6]int{1, 2, 3, 4, 5, 6}
// 省略
array := [6]int{1, 2, 3, 4, 5, 6}
スライス
宣言
var a []int
構造体
for
for i := 0; i < 10; i++ {
fmt.Println(i)
}
for _, e := range array {
fmt.Println(e)
}
while
map
宣言
var m map[key_type]value_type
初期化
m = make(map[key_type]value_type)
要素伴った初期化
var m = map[key_type]val_type{
key1: val1,
key2: val2,
}
挿入
m[key] = val
要素の取得
val = m[key]
削除
delete(m, key)
存在するかの確認
val, ok = m[key]
for
for k, v := range m {
fmt.Println(m, v)
}
三項演算子
ないので諦める(参考: Goには三項演算子a?b:cはない ―― 代わりの書き方)
特にIntのMin/Maxがないので、そこで少し書き方が冗長になる。
文字列の処理
sprintf
fmt.Sprintf("id: %d, name: %s\n", i, name)
文字列の分割
s := strings.Split("ABC,DEF", ",") // return []string
チャネル
エラーハンドリング
新しいエラーを投げる
return nil, errors.New("Faield to get Document from response")
logging
Godoc
で検索すれば登録される(?)
バッジはこのToolsリンクから
CLI
docopt
Travis CI
Building a Go Project (まだ確認してないがgodepサポートとかもあるらしい)
.travis.yml
を直下におく。
.travis.yml
の例:
language: go
go:
- 1.5
- tip
install:
- go get github.com/... (or use Makefile)
scripts:
- go test -v .
.travis.yml
をpushしたら Travis CI で設定をする。
Coveralls
See Go + Travis CI + Coveralls でCI環境を作る - Qiita
language: go
go:
- 1.5
- tip
before_install:
- go get github.com/axw/gocov/gocov
- go get github.com/mattn/goveralls
- if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi
script:
- $HOME/gopath/bin/goveralls -repotoken $COVERALLS_TOKEN
env:
global:
secure: <COVERALLS_TOKEN>
TOKENの作り方
TOKENをCoverallsのサイトからとってきて
travis encrypt COVERALLS_TOKEN=<TOKEN>
もし travis
コマンドが入ってなければ
$ sudo gem install travis
テスト
Go は、 assert やその他テストを構造化する仕組みなどを標準で提供しない代わりに、最小の API と十分なコマンドを提供することでテストを限りなく「ただの Go プログラム」で書けるようにしています。(Go の Test に対する考え方)
手順
- ファイル
bar.go
に対するテストとしてbar_test.go
を同じフォルダに用意 - テストするパッケージを
bar
として、 パッケージ名をbar_test
とする -
testing
パッケージをimportする - 次のようにテストを書く
package bar_test
import "testing"
func TestSomeFunc(t *testing.T) {
actual := "a"
expected := "b"
if actual != expected {
t.Errorf("\ngot %v\nwant %v", actual, expected)
}
}
最後に $ go test
を実行して結果をみる。
go testのオプション
-
-v
: より詳細に結果を見る
その他
最初に初期化が必要なものは init()
の中で初期化ができる。
TIPS
MapやSliceの比較
if !reflect.DeepEqual(expected, actual) {
t.Errorf("\ngot %v\nwant %v", actual, expected)
}
GAE
I/O
Json
import "encoding/json"
Marshal
user := User{
Id: 0,
Name: "sotetsuk",
Friends: []string{"pikachu", "gopher"},
}
b, err := json.Marshal(user) // []byte
Unmarshal
var user User
err := json.Unmarshal(userBytes, user)
Toml
正規表現
import "regexp"
コンパイル
Compile
or MustCompile
でコンパイルする。MustCompileはコンパイルに失敗するとpanicを返す。
ダブルクォーテーションのエスケープ等が面倒なので、バッククォーテーションで囲むのが良い。
r := regexp.MustCompile(`expr`)
マッチした文字列を全て抜き出して配列へ格納する
s := ""
r := regexp.MustCompile(``)
fmt.Println(r.FindAllStringSubmatch(s, -1))
パッケージ
バッジリスト
こんな感じにバッチがつく
- Godoc: GodocページのToolsリンクから
- TravisCI: Travisのサイトから
- Coveralls: Coverallsのサイトから
- Version: Version Badgeから
- License: shields.ioから
Versionのバッジは反映を早くするためにWebhookを設定するのが良い。
依存管理
GoDep
$ godeq save
とか色々書く
クロスコンパイル
$ gox
と打つだけでクロスコンパイルを並列で実行してくれる。
ライブラリ一覧
- github.com/puerkitobio/goquery: スクレイピング
- github.com/PuerkitoBio/gocrawl: クローリング
- github.com/sirupsen/logrus: ロギングライブラリ
- github.com/k0kubun/pp: pretty print