Help us understand the problem. What is going on with this article?

Goチートシート(個人メモ)

More than 3 years have passed since last update.

取り敢えず形だけ(ごめんなさい)。
随時更新します。

環境設定

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

チャネル

Visualizing Concurrency in Go

エラーハンドリング

新しいエラーを投げる

return nil, errors.New("Faield to get Document from response")

logging

Godoc

Godoc

で検索すれば登録される(?)

バッジはこのToolsリンクから

スクリーンショット_2016-06-04_23_52_05.png

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 に対する考え方

手順

  1. ファイル bar.go に対するテストとして bar_test.goを同じフォルダに用意
  2. テストするパッケージを bar として、 パッケージ名を bar_test とする
  3. testing パッケージをimportする
  4. 次のようにテストを書く
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

GoDoc: encoding/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

正規表現

逆引きGolang (正規表現)

import "regexp"

コンパイル

Compile or MustCompile でコンパイルする。MustCompileはコンパイルに失敗するとpanicを返す。
ダブルクォーテーションのエスケープ等が面倒なので、バッククォーテーションで囲むのが良い。

r := regexp.MustCompile(`expr`)

マッチした文字列を全て抜き出して配列へ格納する

s := ""
r := regexp.MustCompile(``)
fmt.Println(r.FindAllStringSubmatch(s, -1))

パッケージ

バッジリスト

こんな感じにバッチがつく

スクリーンショット 2016-06-05 2.22.19.png

  • Godoc: GodocページのToolsリンクから
  • TravisCI: Travisのサイトから
  • Coveralls: Coverallsのサイトから
  • Version: Version Badgeから
  • License: shields.ioから

Versionのバッジは反映を早くするためにWebhookを設定するのが良い。

依存管理

GoDep

$ godeq save とか色々書く

クロスコンパイル

github.com/mitchellh/goxを使う。

$ gox と打つだけでクロスコンパイルを並列で実行してくれる。

ライブラリ一覧

参考文献

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away