macOSでのインストール
macOS High Sierra 10.13.2で試しています。
手順
- Downloadsに移動
- Stable versionsから、以下のリンクをクリック
- File name:
go<バージョン>-darwin-amd64.pkg
- Kind: Installer
- OS: macOS
- Arch: x86-64
- File name:
- ダウンロードしたパッケージをダブルクリック
- 以下macOSの標準のインストーラで操作します。特に迷うことはありません。
パッケージは /usr/local/go
以下に入るようです。
勝手に /usr/local/go/bin
がPATHに追加されているようですが、
これは、 /etc/profile
経由で、
/usr/libexec/path_helper
というプログラムが動いているためのようです。
コンパイル
基本コマンド
go build
: ビルドgo install
: インストール
パッケージ名
ざっとhelp読んだだけでまだ試していないので間違いがある可能性は高いです。
go get
などに指定するものはパッケージ名だが、
パッケージ名にはリポジトリのURLが指定可能[^1]。
ただし、リポジトリがどのVCSを使っているかどうかは分からないため、
URLの最後に.git
などをつける。
例外的に、GitHubなどは以下のように.git
とかつけなくてOK
import "github.com/user/project"
ビルドにはHEADが使われる。 指定する方法はない模様。。。
main
以下のものがmainと判定される。
- mainパッケージ
- main関数
package main
func main() {
}
package
構文は “package” + パッケージ名
package main
import
構文は以下のどちらか
import "io"
まとめてインポートする場合
import (
"io"
"log"
)
パッケージ名を指定できる。
import "lib/math" // -> math.Sinのようにアクセスする
import m "lib/math" // -> m.Sinのようにパッケージ名でアクセスする
import . "lib/math" // -> Sinのようにパッケージ名なしでアクセスする
import _ "lib/math" // -> 参照されていないパッケージを組み込む必要がある場合
if
変数定義が可能
簡易文付きifという書き方で、ブロックだけで有効な変数定義が書ける。
if x := f(); x < y {
注意点
ifのあとのカッコは不要
演算子
整数同士の割り算の結果は整数になるのに注意。
switch
- 文法はswitch〜case
- デフォルトはフォールスルーしない(最近の言語に多い)
- fallthrough予約語あり。
- caseに条件式も書くことが可能。
型アサーション
Javaで言えばClass#castのようなものか。
x.(T)
ただしこれは失敗してしまうとpanicが発生してプログラムが停止する。 これを避けるためには以下のように2つの値に代入させる。
i, isInt := x.(int)
配列
- 書き方が特殊
- 例:
a := [5]int {1,2,3,4,5}
- 例:
- 要素が少な0い場合は0で埋められる
- 例:
a := [5]int {1,2, 3}
=>{1,2,3,0,0}
- 0以外で埋められる例
- boolean: false
- complex: 0+0i
- string: “"(空文字列)
- 例:
- 要素数の省略
- 例:
a := [...]int{1,2,3}
=>[3]int{1,2,3}
- 例:
代入可能
a := [...]int{1,2,3}
a[0] = 0
a[2] = ...
配列は型が同じで要素数が同じ場合のみ代入可能 代入時は全てコピーになる(p84)
スライスに変換する方法
簡易スライス式を使う。
a := [5]int{1, 2, 3, 4, 5}
s := a[:]
defer
Javaなどにおけるfinallyのように、リソースの開放処理に使われる。 注意点としては複数定義した場合は最後の方から呼ばれる。
error
スターティングGo言語p.235より。
戻り値などによく使われるが、これはerrorインタフェースを表す。 エラーを返さないときはnilを返す。
func RaiseError() error {
return nil
}
string
- String literals
- String types
- strings - The Go Programming Language
- strconv - The Go Programming Language
基本
- ダブルクォートで囲ったものがstring型になる。
\n
などは処理を行う(改行コードになる)
stringはバイト列。→Unicode的な文字はrune
以下のようにすると、「あ」のUTF-8表現 0xE3 0x81 0x82 の先頭バイト 0xE3 = 227 が表示される。
package main
import "fmt"
func main() {
str := "あいう"
fmt.Print(str[0])
}
RAW文字列
- バッククォートで囲む。
\n
など処理を行わない。
rune
charのようなもの
stringはバイト列。runeは文字単位でアクセスできる。 runeはint32の別名。入っているのはUTF-32
stringとの変換
- string → rune:
[]rune(s)
- rune → string:
string(r)
package main
import "fmt"
func main() {
s := "あいう"
r := []rune(s)
s2 := string(r[0])
fmt.Print(s2)
}
fmt.Printf
スターティングGo言語p54より。 いわゆる普通のprintf
書式指定や引数の数に間違いがあるときは出力にエラーの内容が出る。
Go特有の書式
- %v: どんな型でもOK
- %#v: Goのリテラル形式
- %T: 型情報
type
構文は以下のどちらか
type NewMutex Mutex
まとめて定義する場合
type (
NewMutex Mutex
)
Go言語でのtypeはC言語のtypedefのようなもの。 ただし順番が逆。
- C言語:
typedef unsigned char byte
- Go言語:
type byte uint8
json
ポイントとしては、構造体のフィールド名は大文字にすること。 Go言語では大文字 = publicの扱いなので当たり前と言えば当たり前ですが。。。
以下に構造体の例。
type Page struct {
Title string `json:"title"`
Url string `json:"url"`
Content string `json:"content"`
}
ライブラリ
cli
- urfave/cli: A simple, fast, and fun package for building command line apps in Go
- Golangでcliツール作るならこれで! - Qiita
yaml
- go-yaml/yaml: YAML support for the Go language.
- yaml - GoDoc
- go で yaml 等を「map[interface{}]interface{}」型で読み込んだ際の動的型の参照方法 - Qiita
- 【go】golangでyamlを読み込んでstructに入れるメモ - gopkg.in/yaml.v2 - tweeeetyのぶろぐ的めも
[^1] go help importpath