Skip to content

Instantly share code, notes, and snippets.

@raydive
Last active August 29, 2015 14:06
Show Gist options
  • Save raydive/64075c9590bd751650dc to your computer and use it in GitHub Desktop.
Save raydive/64075c9590bd751650dc to your computer and use it in GitHub Desktop.

Goのお話(仮)

Goとはなにか

  • Google発のプログラミング言語
    • 2009年発表
    • Ken Thonmpson、Rob Pikeなど
  • 特徴
    • シンプルな言語仕様
    • 開発環境の充実
    • 豊富な標準パッケージ
    • 高速なコンパイル
  • Ver1.3(2014年6月)が最新版

どんなところで使われているか

会社

ツール類

  • peco
    • 元々はpercolというのがあってそれをGolangで再実装したのがpeco
  • Vim使ってる人がgolangでちょこちょこツール書いている様子が見受けられる

Web開発

ざくっと説明

raydive/voicetext_apiをちょっと見 ながら、ふんふんと聴いてください。

シンプル(と言われている)な言語仕様

package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}
  • package から始まる
    • プログラムの開始はmain packageのmain関数から始まる
  • importで他のパッケージを読み込む
  • 複数パッケージならばこんなかんじ
import {
    "fmt"
    "hoge"
    "fuga"
}
  • 変数
    • 下の場合は型推論され、xはintになる
    • 明示的に値が初期化されなかった場合はゼロ値になる
    • 型は値の後ろに書く
var x int = 1
x := 1
var y int // y = 0で初期化される
  • 関数
    • 戻り値の型は後ろ
    • 引数は値渡し
      • ポインタで参照渡しできる
    • 複数の値を戻り値に出来る
      • エラー処理は戻り値で(例外などない!)
func hoge(x int, y int) int {
   // 略
}
var hoge [4]string  // 配列
var fuga []string   // slice
  • Map
    • 個人的にこの書き方はいまいちすっと入らない
    • map[key]valueの順
var temp map[int]string = map[int]string{
  1: "first",
  2: "second",
}

temp[1] // first
_, ok := temp[2] // 対応する値があればokにtrueが入る
  • ポインタ
    • 伝統的な*でポインタ
    • ポインタ演算はできません
  • 構造体(struct)
    • クラスとかそういうものはばっさり切り捨て
    • ただし構造体型に対してメソッドを定義出来る
  • インタフェース
    • 例えばHogeという関数名でintを返すインタフェースがあったとき、構造体に対してHogeというメソッドを定義するとこのHogerインタフェースに適合したことになる
type Hoger interface {
    Hoge() int // 
}
  • 構造体やインタフェースの拡張も出来る
    • 型の埋め込みという
type Task struct {
    ID int
    *User // 埋め込み
}

type User struct {
    Name string
}

// task.Nameのように、あたかもTaskがNameをもっているように書ける
  • 並列処理
    • Goroutineを使ってChannelを介したやりとりによって、並列処理を行う
    • 「共有メモリを使って通信せず、通信によってメモリを共有せよ」
    • Go の並行処理 - Block Rockin’ Codes
    • Goroutine:複数のスレッド上で多重化されている処理の流れ
      • go文で関数を実行すると起動
    • channelを通してデータをやりとりする
      • channelから読み出すデータがない場合はそこでロックされる
    • channelを介した並列処理が推奨されるが、一般的なスレッドプログラミング(LockやMutexを使用した)もできる
    • runtime.GOMAXPROCS()にコア数指定すると、マルチコアを使い切るようにできる
      • CPUの(論理)コア数はruntime.NumCPU()で取得可能
func fuga1(c chan int) {
	for i := 0; i < 10 ; i++ {
		c <- i
	}
}

func fuga2(c chan int) {
	for x := range c {
		print(x) // 0123456789
	}
}

func hoge() {
	ch := make(chan int)
	go fuga1(ch)
	go fuga2(ch)
}

個人邸意見

  • betterなC言語というイメージ
  • Mapの書き方がなんかすっと入らない
  • 検索しづらい
  • エラー処理がif 〜で毎回書かなければいけないのは、イマイチ好きじゃない
  • 並列処理の書きやすさはよい

開発環境の充実

  • 標準でプログラムの整形をしてくれるツールやパッケージ管理もしてくれる
    • コンパイラはもちろんドキュメント生成ツールまで一式
  • プログラムのフォーマット(インデントがどれだけとか)が公式で決まっている、 パッケージ管理も決まっていたりと初めから整っている
    • go get
    • go fmt
    • go test などなど
  • VimやEmacs、IDEのプラグインもあったりする
  • Goでのお作法に則っていれば、それほど環境整備に時間はかからない

パッケージ構成

  • $GOPATH
    • src
    • pkg
    • bin
  • $GOPATHはどのディレクトリでもよい
    • 他のツールと合わせてプロジェクトごとに$GOPATH設定して開発
  • $GOROOT
    • goがインストールされているところ
    • 必ずしも設定が必要ではないが、ツールによっては必要
      • Vim-goやIntelliJでも必要

勉強するのはどうすればよいか

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment