マニュアル: Go(言語)

投稿日: 更新日:

macOSでのインストール

macOS High Sierra 10.13.2で試しています。

手順

  1. Downloadsに移動
  2. Stable versionsから、以下のリンクをクリック
    • File name: go<バージョン>-darwin-amd64.pkg
    • Kind: Installer
    • OS: macOS
    • Arch: x86-64
  3. ダウンロードしたパッケージをダブルクリック
    • 以下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型になる。
  • \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

yaml

[^1] go help importpath

公式サイト

外部サイト

逆引きマニュアル