Go Go language!
有山圭二
(有限会社シーリス 代表)京都GTUG 勉強会 Jul 24, 2010
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 2
自己紹介 – 有山 圭二 (twitter id: keiji_ariyama)
大阪のソフトウェア会社、 有限会社シーリス代表。
手間暇かけてくだらないことをするのが大好きで、仕事の
合間に「僕が死んだら...」「Escape from the KAIGI」等を
開発。フリーソフトウェアとして公開している。
普段仕事で使用するプログラム言語は、Java, PHP, Perl,
C#, VB.NET。CやC++は、趣味程度にしか使ったことがな
い。
新しいものに挑戦するときは、気づかないうちに、踏まな
くてもいい地雷を、順番に踏んでいく体質。
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 3
Go言語の登場
○
2009年11月10日、Google社は新しいプログラム言語
「Go」を公開した。
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 4
なんだこれ
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 5
2007年11月 Android発表
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 6
2008年4月 Google App Engine発表
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 7
2009年11月 Go Language発表
京都GTUG Go言語勉強会 Jul 24, 2010 Copyright C-LIS CO., LTD. 2010 8
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 9
Go言語に関する疑問
○
何に使うの?
○
なんで今更、新しい言語を作る必要が?
○
使うと何か良いことがあるの?
これが、今日の本題です
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 10
Agenda
○
自己紹介
○
Goに関する疑問
○
Go言語ってなんだ
●
対応OS/アーキテクチャ
○
Goの特徴
○
Goの目標
○
インストールからHello World
○
言語仕様
●
変数の宣言
●
変数の型
●
配列とスライス
●
分岐構文
●
繰り返し構文
●
goroutine
●
構造体
●
ポインタ
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 11
Go言語とは
○
Googleが開発した新しいシステムプログラミング言語
○
オープンソースで開発
●
BSDライセンス
○
コンパイラやツール類は、C言語で開発
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 12
システムプログラミング
システムプログラミング(英: System programming)は、システムソフトウェアの
プログラミングを指す。
アプリケーションソフトウェアのプログラミングとの主な違いは、ハードウェアとの
関わりが大きい点である。他にも以下のような特徴がある。
●
プログラマはハードウェアやその他のシステムの特徴を前提として、それらを
利用してコードを作成する。例えば、そのハードウェアで効率がよいとわかっ
ているアルゴリズムを採用したりする。
以下のような低レベルなプログラミング言語が使われることが多い。
●
リソースに制限のある環境で動作可能な言語を使う。
●
効率がよく、実行時オーバーヘッドの小さい言語を使う。
●
ランタイムライブラリが非常に小さいか、全くライブラリを持たない言語を使
う。
●
メモリアクセスや制御構造を直接制御できる。
●
プログラムの一部を直接アセンブリ言語で書くことが出来る。
( Wikipedia より)
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 13
なぜ、新しい言語を作ったのか?
○
既存のシステムプログラミング言語と、環境に不満があったか
ら
○
現在、主流の言語には、
●
効率的なコンパイル
●
効率的な実行
●
容易なプログラミング
この三つを全て満たすものがない
○
開発者は、安全性や効率より、より容易にプログラムが出来る
PythonやJavaScriptのような動的型付け言語を選択している
効率的なコンパイル
容易なプログラミング 効率的な実行
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 14
Goの目標
○
PHPやPython等、動的型付けのインタプリタ言語のように
プログラミングが容易
○
CやC++等、静的型付け言語の安全性と効率性
○
ネットワーク接続、マルチコア・コンピューティングを
サポート
○
単体のコンピュータ上で、大きな実行ファイルが数秒でビルド
できる速度
○
軽量な型システム
○
並列処理のサポート、および高速で効率的な自動ガベージコレ
クション
システムプログラミング言語を作る
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 15
Goが影響を受けた言語
○
C(基本的な文法)
○
Pascal/Modula/Oberon (宣言/パッケージ)
○
Newsqueak/Limbo (並列処理)
京都GTUG Go言語勉強会 Jul 24, 2010 Copyright C-LIS CO., LTD. 2010 16
インストール
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 17
対応OS/アーキテクチャ
○
OS
●
darwin
●
freebsd
●
linux
●
nacl
○
アーキテクチャ
●
amd64 (a.k.a x86-64)
●
386 (a.k.a x86, x86-32)
●
arm
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 18
Windows...
2010年7月時点で、Windowsのサポートは無し
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 19
Cygwin で動くか実験
○
インストール
●
bison
●
make
●
gcc
●
ed
●
gawk
●
Mercurial
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 20
無理だった...
ビルド時にERROR 発生
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 21
ERRORの内容で検索してみた
golang-nuts
I
nstalling Go "make all" error
http://groups.google.co.kr/group/golang-nuts/browse_thread/thread/1e43f088d360cf75
You can't run Go under Cygwin this way.
「Cygwinでは動かないよ」
Windows用のバイナリも出てます(サードパーティ)
http://code.google.com/p/go/wiki/WindowsPort
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 22
Linux(CentOS amd64) にインストール
$ yum install bison gcc make ed gawk
$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
$ cd $GOROOT/src
$ ./all.bash
ツール類のインストール
$ export GOROOT=$HOME/go
$ export GOOS=linux
$ export GOARCH=amd64 環境変数の設定
$ rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
$ yum install '*mercurial*' - 1.4.1 Mercurialのインストール
ソースのチェックアウトとインストール
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 23
インストール完了
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 24
Hello World
package main import fmt "fmt" func main() {
fmt.Printf("Hello, world\n") }
$ 6g hello.go
$ 6l hello.6
$ ./6.out Hello, world 実行
京都GTUG Go言語勉強会 Jul 24, 2010 Copyright C-LIS CO., LTD. 2010 25
Go の基礎
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 26
Hello World
○
エントリポイントは、mainパッケージのmain関数
package main import fmt "fmt" func main() {
fmt.Printf("Hello, world\n") }
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 27
セミコロンがない!
○
ステートメントの末尾にセミコロン(;)がない
●
セミコロンは、パーザーの都合であって、開発者のためではない
(Language Design FAQ - Why are there braces but no semicolons?)
○
一行に複数のステートメントを記述する場合は、セミコロンを
記述する
package main import fmt "fmt" func main() {
fmt.Printf("Hello, world\n"); fmt.Printf("Hello, world 2\n") }
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 28
コメント
○
C++のコメントと同様
●
// …
●
/* … */
package main import fmt "fmt" /*
メインエントリポイント
*/
func main() {
// 文字列を表示
fmt.Printf("Hello, world\n") }
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 29
変数
○
var キーワードのあと、「変数名」、「型名」と続く
package main import fmt "fmt" func main() {
var num int = 0
fmt.Printf("Hello, world %d\n", num) }
num := 0
○
型名を省略可能
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 30
型
bool ブール型 ( true or false ) uint8 符号無し8ビット (0 to 255) uint16 符号無し16ビット (0 to 65535)
uint32 符号無し32ビット (0 to 4294967295)
uint64 符号無し64ビット (0 to 18446744073709551615) int8 符号付き8ビット (-128 to 127)
int16 符号付き16ビット (-32768 to 32767)
int32 符号付き32ビット (-2147483648 to 2147483647)
int64 符号付き64ビット (-9223372036854775808 to 9223372036854775807) float32 IEEE-754 32ビット浮動小数点
float64 IEEE-754 64ビット浮動小数点 byte uint8の別名
The Go Programming Language Specification - Types
http://golang.org/doc/go_spec.html#Types
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 31
int長の確認
package main import fmt "fmt" func main() {
var a1 uint64 = 1<<64 -1 var a2 uint32 = 1<<32 -1 var a3 uint = 1<<32 -1
fmt.Printf("unsigned int64 = %v\n", a1) fmt.Printf("unsigned int32 = %v\n", a2) fmt.Printf("unsigned int = %v\n", a3)
}
$ ./6.out
unsigned int64 = 18446744073709551615 unsigned int32 = 4294967295
unsigned int = 4294967295 実行
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 32
int長の確認
package main import fmt "fmt" func main() {
var a1 uint64 = 1<<64 -1 var a2 uint32 = 1<<32 -1 var a3 uint = 1<<64 -1
fmt.Printf("unsigned int64 = %v\n", a1) fmt.Printf("unsigned int32 = %v\n", a2) fmt.Printf("unsigned int = %v\n", a3)
}
コンパイルエラーが発生する
ビット長を指定しないint型は32bit
$ 6g int64.go
int64.go:9: constant 18446744073709551615 overflows uint 実行
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 33
暗黙 の型変換
package main import fmt "fmt" func main() {
var num1 uint16 = 0xffff var num2 uint32 = 0x0 num2 = num1
fmt.Printf("%v", num2) }
コンパイルエラーが発生する
$ 6g implicit_numeric_conversion.go
implicit_numeric_conversion.go:10: cannot use num1 (type uint16) as type uint32 in assignment
実行
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 34
Goには、暗黙の型変換が存在しない
○
変換される値を開発者自身が知らなければならず、混乱を生む
○
コンパイラの実装が困難
●
マシンアーキテクチャの違いを吸収(ポータビリティを維持)する
実装にしなければならない
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 35
int型の変換
package main import fmt "fmt" func main() {
var num1 uint = 0xffff var num2 uint32 = 0 num2 = num1
fmt.Printf("%v", num2) }
uintと、uint32。
値の取り得る範囲は同じでも、違う型として扱われる
$ 6g implicit_numeric_conversion.go
implicit_numeric_conversion.go:10: cannot use num1 (type uint) as type uint32 in assignment
実行
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 36
明 示的な型変換
package main import fmt "fmt" func main() {
var num1 uint = 0xffff var num2 uint32 = 0x0 num2 = uint32(num1) fmt.Printf("%v", num2) }
$ 6g explicit_numeric_conversion.go
$ 6l explicit_numeric_conversion.6
$ ./a.out 65535 実行
京都GTUG Go言語勉強会 Jul 24, 2010 Copyright C-LIS CO., LTD. 2010 37
配 列/スライス/マップ/構造体
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 38
配 列
package main import fmt "fmt" func main() {
var arra []int = []int{0, 1, 2}
var arra2 []int = make([]int, 100) fmt.Printf("%d\n", len(arra))
fmt.Printf("%d\n", len(arra2)) arra2[10] = 20
fmt.Printf("%d\n", arra2[10]) }
$ 6g array_test.go
$ 6l array_test.6
$ ./a.out 3
100 20 実行
○
角括弧[]に続いて型を宣言
●
配列個数を指定しない場合
○
make(配列の型, 個数)
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 39
スライス
package main import fmt "fmt" func main() {
var arra2 []int = make([]int, 100) var slice2 []int = arra2[0:32]
arra2[10] = 20
fmt.Printf("%d\n", len(arra2))
fmt.Printf("arra2[10] %d\n", arra2[10]) fmt.Printf("%d\n", len(slice2))
fmt.Printf("slice2[10] %d\n", slice2[10]) }
$ 6g slice_test.go
$ 6l slice_test.6
$ ./a.out 100
arra2[10] 20 32
slice2[10] 20 実行
○
配列の一部を参照する
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 40
マップ
package main import fmt "fmt" func main() {
var timeZone = map[string] int { "UTC": 0*60*60,
"EST": -5*60*60, "CST": -6*60*60, "MST": -7*60*60, "PST": -8*60*60, "JST": 9*60*60, }
var second int = 0 var ok bool = false
second, ok := timeZone[“JST”] fmt.Printf("JST %d\n", second) }
$ 6g map_test.go
$ 6l map_test.6
$ ./a.out
JST 32400 true 実行
○
マップ
○
timeZone[文字列]で参照
○
キーが存在しない場合は、
2番目の戻り値(ok)がfalse
になる
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 41
構造体
package main import fmt "fmt" type person struct { name string point int }
func main() {
p := new(person) p.name = "test" p.point = 100
fmt.Printf("%s %d\n", p.name, p.point) }
$ 6g struct_test.go
$ 6l struct_test.6
$ ./a.out Test 100 実行
○
newキーワードで、
構造体をインスタンス化す
る
○
配列がmakeだった事に
注意
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 42
ポインタ
package main import fmt "fmt" func main() {
var str string = "ok" var pt *string = &str
fmt.Printf("value is %s", *pt) }
$ ./6.out Value is ok 実行
○
ポインタが使える
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 43
ポインタ
package main import fmt "fmt" func main() {
var str string = "ok" var pt *string = &str pt++
fmt.Printf("value is %s", *pt) }
$ 6g pointer.go
pointer.go:9: invalid operation: pt += 1 (type *string + int) 実行
○
Goは、ポインタの演算は
出来ない
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 44
Goのメモリ管理
○
Garbage Collectionでメモリを回収
○
並列処理に最適化するためには、メモリ管理を自動化する
アプローチが適していると判断
○
現在はMark and Sweep方式だが、より効率よく、効果が高
いGC方式へ置き換え作業中
京都GTUG Go言語勉強会 Jul 24, 2010 Copyright C-LIS CO., LTD. 2010 45
制御文
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 46
分岐 (if else)
package main import fmt "fmt" func main() {
var num int = 5 // var num int = 3
If num == 5 {
fmt.Printf("number is 5\n") } else if num == 3 {
fmt.Printf(“number is 3\n") } else {
fmt.Printf(“number is unknown\n") }
}
$ 6g if_test.go
$ 6l if_test.6
$ ./a.out number is 5 実行
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 47
繰 り返し(for)
package main import fmt "fmt" func main() {
for i := 0; i < 100; i++ {
fmt.Printf("loop %d\n", i) }
}
$ 6g for_test.go
$ 6l for_test.6
$ ./a.out loop 0 ....
loop 99 実行
○
while や do while構文は
Goにはない
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 48
選択 (switch)
package main import fmt "fmt" func main() {
var num int = 1 switch num {
case 1: fmt.Printf(“case 1\n") case 2: fmt.Printf("case 2\n")
case 3,4,5,6,7: fmt.Printf("case > 3\n") default: fmt.Printf(“case unknown\n”) }
}
$ 6g switch_test.go
$ 6l switch_test.6
$ ./a.out 19
実行
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 49
関数(func)
package main import fmt "fmt" func main() {
var num int = sum(7, 12) fmt.Printf("%d\n", num) }
func sum(a int, b int) int { return a+b
}
$ 6g func_test.go
$ 6l func_test.6
$ ./a.out 19
実行
○
func キーワードの後に
●
関数名 sum
●
引数 (a int, b int)
●
戻り値 int
の順で記述する
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 50
可変の引数
package main import fmt "fmt" func main() {
var num int = sum(7, 12, 2, 6) fmt.Printf("%d\n", num)
}
func sum( values ... int) int { var result int = 0;
for i := 0 ; i < len(values); i++ { result += values[i]
}
return result; }
$ 6g func_multi_args_test.go
$ 6l func_multi_args_test.6
$ ./a.out 27
実行
○
引数を ... と指定すると、
数を特定しない引数となる
○
関数内からは、
配列としてアクセスする
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 51
複 数の値を返す
package main import fmt "fmt" func main() {
max, min := minMax(7, 12, 2, 6) fmt.Printf("%d %d\n", max, min) }
func minMax(... int) int, int {
var maxFlg, minFlg bool = false var max, min int = 0
for i := 0 ; i < len(values); i++ { If maxFlg == false {
max = values[i] maxFlg = true }
If minFlg == false { min = values[i] minFlg = true }
If max < values[i] max = values[i] If min > values[i] min = values[i] }
return (max, min); }
$ 6g func_multi_returns_test.go
$ 6l func_multi_returns_test.6
$ ./a.out 2 12 実行
○
戻り値をカンマで区切って
複数指定可能
○
関数の呼び出し元では、
受側の変数をカンマで区切
る
京都GTUG Go言語勉強会 Jul 24, 2010 Copyright C-LIS CO., LTD. 2010 52
並 列処理
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 53
goroutine
○
並列処理を容易に行うための
構文
○
func() { … } 内の処理を並列
で実行する
○
go sum(...)のように、関数も
実行可能
package main import fmt "fmt" import time "time" func main() {
var num uint = 0 var num2 uint = 0 go func() {
for i := 0; i < 100; i++ { num++
time.Sleep(1000*1000*1000) }
}()
go func() {
for i := 0; i < 200; i++ { num2++
time.Sleep(2*1000*1000*1000) }
}()
for ; (num < 100 || num2 < 200); {
fmt.Printf("%d %d\n", num, num2) time.Sleep(1000*1000*1000) }
}
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 54
チャンネル
○
goroutine と値を共有したり、goroutine同士、または
goroutineとメインルーチンが同期をする仕組み
メイン ルーチン
goroutine チャンネル
○
メインルーチンはチャンネルに値を入力
○
goroutineはチャンネルから値を取り出し
○
値がなければ、スレッドがブロックされ、チャンネルに値が
入力されるまで待機する(同期)
京都GTUG Go言語勉強会 Jul 24, 2010 Copyright C-LIS CO., LTD. 2010 55
その他
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 56
識 別子はUnicode
○
日本語の変数・関数名も可能
package main import fmt "fmt" func main() {
var あいう string = "unicode test" var num int = 加算(7, 12)
fmt.Printf("%v\n", あいう) fmt.Printf("%d\n", num) }
func 加算(a int, b int) int { return a+b
}
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 57
変数や関数のエクスポート
○
識別子の最初の1文字が大文字の場合、パッケージ外に
エクスポートする
○
日本語等、他の言語の場合は対応出来ない
○
“X日本語”のようにする解決策もあるが、満足しないことは
明らか
○
別の選択肢を考えている
On a related note, since an exported identifier must begin with an upper-case letter, identifiers created from “letters” in some languages can, by definition, not be
exported. For now the only solution is to use something like X日本語, which is clearly unsatisfactory; we are considering other options.
Language Design FAQ – What's up with Unicode identifiers? http://golang.org/doc/go_lang_faq.html#unicode_identifiers
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 58
例外
○
try-catch-finally 構文は、コードが読みにくくなると考えてい
るのでサポートしない
○
組み込み関数 signal と recover を使ってエラーを処理する
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 59
まとめ - Goの現状
○
現状でGoは、未成熟な言語
●
最終的な利用ターゲットはシステム・プログラマだが、信頼性が重視さ
れるシステム開発に採用するには、十分ではない
●
冒険的なユーザーが利用して、意見を出し合って成熟させていく余地が
ある(そのためのオープンソース!)
○
Go単体での開発は現実的ではない。CやC++で開発された過去
の資産の呪縛から逃れることは出来ないと思われる
○
統一された言語仕様。ネットワーク、マルチプロセッサ、
並列処理への対応、統合されたライブラリ環境が、Goの強み
If you try to write Java programs in Go. you may become
frustrated. If you write Go programs in Go. you will be
much more productive.
(Google I/O 2010)
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 60
まとめ - Goの将来
○
将来的、現在よりも効率的で、遅延の少ないGCの実装が期待
される
○
現在のGo言語は、新規開発はもちろん、既存のソフトウェア
資産と組み合わせて用いる強力な「ツール」であり、最終的に
は、
●
効率的なコンパイル
●
効率的な実行
●
開発の容易さ
最もバランスの取れたシステムプログラミング言語となり得る
Copyright C-LIS CO., LTD. 2010
京都GTUG Go言語勉強会 Jul 24, 2010 61
ご静聴 ありがとうございました
本資料の内容の一部は、Googleが作成、提供しているコンテンツを複製したもので、 クリエイティブコモンズの表示 3.0 ライセンスに記載の条件に従って使用しています。 本資料は、有限会社シーリスの著作物であり、
クリエイティブコモンズの表示-非営利-継承 3.0 Unported ライセンスの元で公開しています。
京都GTUG Go言語勉強会 Jul 24, 2010 Copyright C-LIS CO., LTD. 2010 62
参考資料
○
The Go Programming Language
http://golang.org
○
Go programming - Tech Talks - Rob Pike, Russ Cox
http://code.google.com/intl/ja/events/io/2010/sessions/go-programming.html
○