SlideShare uma empresa Scribd logo
1 de 27
Baixar para ler offline
速習 A tour of Go
金谷 敦志 (@todogzm)
13年9月17日火曜日
本資料について
A tour of Goからハンズオンに必要な分を抽出
ハンズオンに必要な未記載分を追記
A tour of Goまたは言語仕様の復習をお勧め
13年9月17日火曜日
ハンズオンにあたって
自身のPCへのGoインストールを推奨します
Go Playgroundでは一部機能に制限あり
Goファイルは、ハンズオンの課題ごとに
フォルダを作成して、そこに置いてください。
ソースのビルドは go build
ソースのテストは go test
13年9月17日火曜日
//フォルダ単位でパッケージ名を付ける
package main
//インポートするパッケージ名
import (
"fmt"
)
//mainパッケージにmain()を置けば実行形式が作られる
func main() {
// パッケージ名.関数名
fmt.Println("Hello, world.")
}
基本構文
13年9月17日火曜日
// intの引数x, yを取ってintの結果を返す
func add(x int, y int) int {
return x + y
}
//複数の値を返すことができる → Cの参照渡しのようなことが不要
func swap(x, y string) (string, string) { //x,yが同じ型→省略可
return y, x
}
//関数をデータとして持つことができる
fn := function(a, b int) int {
return a * b
}
//クロージャも使える
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
関数
13年9月17日火曜日
//型は最後。x,y,zはint型
var x, y, z int
//初期化子(initializer)指定時は型指定不要
var c, python, java = true, 3, "no"
// 関数内では:=を使うことでvar指定が不要
c, python, java := true, 3, "no"
変数
13年9月17日火曜日
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64
uintptr //ポインタの値をそのまま格納するのに充分な大きさの符号なし整数
byte // uint8 の別名
rune // int32 の別名
// Unicode のコードポイントを表す
float32 float64
complex64 complex128
基本型
13年9月17日火曜日
// 型は指定しない
const Pi = 3.14
const (
A = 1
B = "test"
)
定数
13年9月17日火曜日
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
for文
13年9月17日火曜日
// while文は下記のように書く
for sum < 55 {
}
// 無限ループ
for {
}
whileもforで書く
13年9月17日火曜日
package main
import (
"fmt"
"math"
)
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
func main() {
fmt.Println(sqrt(2), sqrt(-4))
}
if文
if a := 3; a < 5 { // if文内にif文スコープ内で有効な変数を宣言
}
fmt.Println(a) //スコープ外のためエラー
13年9月17日火曜日
switch i {
case 0: fmt.Println("Zero")
case 1: fmt.Println("One")
case 2: fmt.Println("Two")
case 3: fmt.Println("Three")
case i>3: fmt.Println("More") // 評価式も書ける
default: fmt.Println("Unknown")
}
switch文
13年9月17日火曜日
package main
import "fmt"
type Vertex struct { //publicな型Vertex
X int //publicなフィールド変数X, Y
Y int
}
func main() {
v := Vertex{1, 2} //v.X = 1; v.Y = 2で初期化
v.X = 4 //フィールドへのアクセスは.を使う
fmt.Println(v.X)
}
struct
13年9月17日火曜日
type Vertex struct {
X int
Y int
}
func main() {
p := Vertex{1, 2}
q := &p //pへのポインタを渡す
q.X = 1e9 //qはpへのポインタなので、p.Xが書き換わる
fmt.Println(p)
}
pointer
var (
p = Vertex{1, 2} // has type Vertex
q = &Vertex{1, 2} // has type *Vertex
r = Vertex{X: 1} // Y:0 is implicit
s = Vertex{} // X:0 and Y:0
)
var q *Vertex = new(Vertex) //ポインタ変数を作成
13年9月17日火曜日
// sliceは、値の配列を参照
// 長さ( length )も含む
// 配列もあるがsliceで代替できるため割愛
func main() {
p := []int{2, 3, 5, 7, 11, 13} //intのslice
fmt.Println("p ==", p)
for i := 0; i < len(p); i++ {
fmt.Printf("p[%d] == %dn", i, p[i])
}
}
slice
13年9月17日火曜日
slicing → p[0:3]など
容量指定
a := make([]int, 5) //len(a) = 5, cap(a) = 5
a := make([]int, 0, 5) //len(a) = 0, cap(a) = 5
sliceの各要素の処理
for i, v := range p { //iはインデックス、vは値
}
不要な変数 → _ を使う
for _, v := range p {
}
append
b := append(a, 8) //aと同じ型で、要素に8を追加したslice
を返す
sliceに対する操作
13年9月17日火曜日
// map はキーと値とを関連付ける
// mapの初期化にはmakeを使う
type Vertex struct {
Lat, Long float64
}
var m map[string]Vertex
func main() {
//キーがstring, 値がVertexのmapを作成
m = make(map[string]Vertex)
m["Bell Labs"] = Vertex{
40.68433, -74.39967,
}
fmt.Println(m["Bell Labs"])
}
map
13年9月17日火曜日
m := make(map[string]int)
m["Answer"] = 42
fmt.Println("The value:", m["Answer"]) // 42が出力
m["Answer"] = 48
fmt.Println("The value:", m["Answer"]) // 48が出力
delete(m, "Answer")
fmt.Println("The value:", m["Answer"]) // 0(intの初期値)
v, ok := m["Answer"] //キーの有無チェックをok(bool)で判定
fmt.Println("The value:", v, "Present?", ok)
for k, v := range m { //キーと値のペアでループを回す
fmt.Println(“Key:”, k, “, Value:”, v)
}
mapに対する操作
13年9月17日火曜日
type Vertex struct {
X, Y float64
}
// Vertex型のポインタ型にAbsメソッドを定義
func (v *Vertex) Abs() float64 {
//mathのインポートが必要
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Println(v.Abs()) //struct変数.メソッド名 でメソッド呼び出し
}
// 同一パッケージ上の型(基本型以外)にメソッドを定義できる
// ポインタ型にすることで、各メソッド呼び出し時の値コピーを防ぐ
// また、ポインタ型だとstructの値更新ができる
Methods
13年9月17日火曜日
type Abser interface {
Abs() float64
}
// 引数なしで返り値の型がfloat64であるAbs()メソッドを
// 持つ型はAbserインタフェースが実装済みと判断される
// つまりインタフェースを実装する、という宣言が不要
Intefaces
13年9月17日火曜日
import (
"fmt"
"strconv"
)
func main() {
// エラーの可能性がある関数は複数の値を返す関数となっている
i, err := strconv.Atoi("102")
if err != nil { //変換失敗時の処理
fmt.Println("Cannot parse : ", err)
return
}
fmt.Println("Parsed: ", i)
}
Errors
// 多値を受け取りerror型がnilか否かでエラー判定する
// errorインタフェースは下記の通り
type error interface {
Error() string
}
// panic/recoverという仕組みもあるが、致命的なエラーの場合のみに使用される
13年9月17日火曜日
go someFunc() // someFuncが別のgoroutineで実行される
//goステートメントは独立したgoroutine(スレッド)として
//関数またはメソッドを同一アドレス空間内で行う
//返り値は取得できない(破棄される)
goroutine
13年9月17日火曜日
// goにより並行処理の実行自体は容易になった
// 並行処理した結果をまとめる部分はchannelを使う
// channelはチャネルオペレータの <- を用いて値の送受信ができる直通ルートの型
// アクターモデルで言うメールボックス、JavaだとLinkedBlockingQueueなど…
// ロックによる排他制御も可能だが普通は使わない
c := make(chan int) // intのチャンネルを作成
c <- 3 // 3をchannelに送る。cの受信準備ができるまでブロック
v := <-c //cに値が来るまでブロックし、値が来れば受け取る
c := make(chan int, 100) //受信バッファを最大100件とする
goroutine / channel
13年9月17日火曜日
// 複数チャンネルからの受信を待つ場合にはselectを使う
// switch文と似た文法だが、caseが実行されるのは、
// 指定のchannelが送受信できるとき
// それまではブロック
select {
case c <- x: //channel xから受信出来た場合は下記を計算
x, y = y, x+y
case <-quit: // channel quitから受信できたときは処理終了
fmt.Println("quit")
return
}
select
13年9月17日火曜日
A tour of Goにない話
13年9月17日火曜日
// deferの後に続く式を書く
// second()はdeferTest()からリターンする直前に実行される
func deferTest() {
defer second()
first()
}
// こういうケースで便利
f, _ := os.Open(filename)
defer f.Close() //処理終了後に確実に閉じる
defer
13年9月17日火曜日
// 同一フォルダ内にファイル名_test.go で置くのが一般的
// テスト関数はpublic, 引数には *testing.Tを渡す
// テスト実行は go test [ファイル名から.goを除去したもの]
// t.Errorまたはt.Fatalが実行されればそのテストは失敗と判断
import (
"testing"
)
func TestFizzBuzz(t *testing.T) {
if result := FizzBuzz(1); result != 1 {
t.Error("Expected : 1, Actual : ", result)
}
if result := FizzBuzz(3); result != "Fizz" {
t.Error("Expected : 3, Actual : ", result)
}
}
テスト
13年9月17日火曜日

Mais conteúdo relacionado

Mais procurados

Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Atsuo Ishimoto
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golfNomura Yusuke
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体digitalghost
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すAromaBlack
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話Moriyoshi Koizumi
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyYuya Takeyama
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールNobuhisa Koizumi
 
20190530-DesignOneGo01
20190530-DesignOneGo0120190530-DesignOneGo01
20190530-DesignOneGo01Kento Sato
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cythonAtsuo Ishimoto
 
LLdeade Python Language Update
LLdeade Python Language UpdateLLdeade Python Language Update
LLdeade Python Language UpdateAtsushi Shibata
 
One - Common Lispでもワンライナーしたい
One - Common LispでもワンライナーしたいOne - Common Lispでもワンライナーしたい
One - Common Lispでもワンライナーしたいt-sin
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
Emacs上のターミナルを最強に
Emacs上のターミナルを最強にEmacs上のターミナルを最強に
Emacs上のターミナルを最強にLintaro Ina
 

Mais procurados (20)

Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料
 
C-langage
C-langageC-langage
C-langage
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golf
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
 
F#のすすめ
F#のすすめF#のすすめ
F#のすすめ
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
20190530-DesignOneGo01
20190530-DesignOneGo0120190530-DesignOneGo01
20190530-DesignOneGo01
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
Gnuplotあれこれ
GnuplotあれこれGnuplotあれこれ
Gnuplotあれこれ
 
LLdeade Python Language Update
LLdeade Python Language UpdateLLdeade Python Language Update
LLdeade Python Language Update
 
One - Common Lispでもワンライナーしたい
One - Common LispでもワンライナーしたいOne - Common Lispでもワンライナーしたい
One - Common Lispでもワンライナーしたい
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
Emacs上のターミナルを最強に
Emacs上のターミナルを最強にEmacs上のターミナルを最強に
Emacs上のターミナルを最強に
 
Python01
Python01Python01
Python01
 

Semelhante a 速習A tour of go

Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsTomohiro Kumagai
 
New Generation Build System "Fly"
New Generation Build System "Fly"New Generation Build System "Fly"
New Generation Build System "Fly"deepblue will
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門bleis tift
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】株式会社ランチェスター
 
Unit test in android
Unit test in androidUnit test in android
Unit test in androidTatsuya Maki
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScriptbleis tift
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理Yuto Matsukubo
 
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftSwift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftTomohiro Kumagai
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方Satoshi Nagayasu
 

Semelhante a 速習A tour of go (14)

Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
Testman
TestmanTestman
Testman
 
大人のお型付け
大人のお型付け大人のお型付け
大人のお型付け
 
New Generation Build System "Fly"
New Generation Build System "Fly"New Generation Build System "Fly"
New Generation Build System "Fly"
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScript
 
Spockの基礎
Spockの基礎Spockの基礎
Spockの基礎
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理
 
CLR/H No.35-2
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2
 
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftSwift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 

速習A tour of go

  • 1. 速習 A tour of Go 金谷 敦志 (@todogzm) 13年9月17日火曜日
  • 2. 本資料について A tour of Goからハンズオンに必要な分を抽出 ハンズオンに必要な未記載分を追記 A tour of Goまたは言語仕様の復習をお勧め 13年9月17日火曜日
  • 5. // intの引数x, yを取ってintの結果を返す func add(x int, y int) int { return x + y } //複数の値を返すことができる → Cの参照渡しのようなことが不要 func swap(x, y string) (string, string) { //x,yが同じ型→省略可 return y, x } //関数をデータとして持つことができる fn := function(a, b int) int { return a * b } //クロージャも使える func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } } 関数 13年9月17日火曜日
  • 6. //型は最後。x,y,zはint型 var x, y, z int //初期化子(initializer)指定時は型指定不要 var c, python, java = true, 3, "no" // 関数内では:=を使うことでvar指定が不要 c, python, java := true, 3, "no" 変数 13年9月17日火曜日
  • 7. bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr //ポインタの値をそのまま格納するのに充分な大きさの符号なし整数 byte // uint8 の別名 rune // int32 の別名 // Unicode のコードポイントを表す float32 float64 complex64 complex128 基本型 13年9月17日火曜日
  • 8. // 型は指定しない const Pi = 3.14 const ( A = 1 B = "test" ) 定数 13年9月17日火曜日
  • 9. package main import "fmt" func main() { sum := 0 for i := 0; i < 10; i++ { sum += i } fmt.Println(sum) } for文 13年9月17日火曜日
  • 10. // while文は下記のように書く for sum < 55 { } // 無限ループ for { } whileもforで書く 13年9月17日火曜日
  • 11. package main import ( "fmt" "math" ) func sqrt(x float64) string { if x < 0 { return sqrt(-x) + "i" } return fmt.Sprint(math.Sqrt(x)) } func main() { fmt.Println(sqrt(2), sqrt(-4)) } if文 if a := 3; a < 5 { // if文内にif文スコープ内で有効な変数を宣言 } fmt.Println(a) //スコープ外のためエラー 13年9月17日火曜日
  • 12. switch i { case 0: fmt.Println("Zero") case 1: fmt.Println("One") case 2: fmt.Println("Two") case 3: fmt.Println("Three") case i>3: fmt.Println("More") // 評価式も書ける default: fmt.Println("Unknown") } switch文 13年9月17日火曜日
  • 13. package main import "fmt" type Vertex struct { //publicな型Vertex X int //publicなフィールド変数X, Y Y int } func main() { v := Vertex{1, 2} //v.X = 1; v.Y = 2で初期化 v.X = 4 //フィールドへのアクセスは.を使う fmt.Println(v.X) } struct 13年9月17日火曜日
  • 14. type Vertex struct { X int Y int } func main() { p := Vertex{1, 2} q := &p //pへのポインタを渡す q.X = 1e9 //qはpへのポインタなので、p.Xが書き換わる fmt.Println(p) } pointer var ( p = Vertex{1, 2} // has type Vertex q = &Vertex{1, 2} // has type *Vertex r = Vertex{X: 1} // Y:0 is implicit s = Vertex{} // X:0 and Y:0 ) var q *Vertex = new(Vertex) //ポインタ変数を作成 13年9月17日火曜日
  • 15. // sliceは、値の配列を参照 // 長さ( length )も含む // 配列もあるがsliceで代替できるため割愛 func main() { p := []int{2, 3, 5, 7, 11, 13} //intのslice fmt.Println("p ==", p) for i := 0; i < len(p); i++ { fmt.Printf("p[%d] == %dn", i, p[i]) } } slice 13年9月17日火曜日
  • 16. slicing → p[0:3]など 容量指定 a := make([]int, 5) //len(a) = 5, cap(a) = 5 a := make([]int, 0, 5) //len(a) = 0, cap(a) = 5 sliceの各要素の処理 for i, v := range p { //iはインデックス、vは値 } 不要な変数 → _ を使う for _, v := range p { } append b := append(a, 8) //aと同じ型で、要素に8を追加したslice を返す sliceに対する操作 13年9月17日火曜日
  • 17. // map はキーと値とを関連付ける // mapの初期化にはmakeを使う type Vertex struct { Lat, Long float64 } var m map[string]Vertex func main() { //キーがstring, 値がVertexのmapを作成 m = make(map[string]Vertex) m["Bell Labs"] = Vertex{ 40.68433, -74.39967, } fmt.Println(m["Bell Labs"]) } map 13年9月17日火曜日
  • 18. m := make(map[string]int) m["Answer"] = 42 fmt.Println("The value:", m["Answer"]) // 42が出力 m["Answer"] = 48 fmt.Println("The value:", m["Answer"]) // 48が出力 delete(m, "Answer") fmt.Println("The value:", m["Answer"]) // 0(intの初期値) v, ok := m["Answer"] //キーの有無チェックをok(bool)で判定 fmt.Println("The value:", v, "Present?", ok) for k, v := range m { //キーと値のペアでループを回す fmt.Println(“Key:”, k, “, Value:”, v) } mapに対する操作 13年9月17日火曜日
  • 19. type Vertex struct { X, Y float64 } // Vertex型のポインタ型にAbsメソッドを定義 func (v *Vertex) Abs() float64 { //mathのインポートが必要 return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v := &Vertex{3, 4} fmt.Println(v.Abs()) //struct変数.メソッド名 でメソッド呼び出し } // 同一パッケージ上の型(基本型以外)にメソッドを定義できる // ポインタ型にすることで、各メソッド呼び出し時の値コピーを防ぐ // また、ポインタ型だとstructの値更新ができる Methods 13年9月17日火曜日
  • 20. type Abser interface { Abs() float64 } // 引数なしで返り値の型がfloat64であるAbs()メソッドを // 持つ型はAbserインタフェースが実装済みと判断される // つまりインタフェースを実装する、という宣言が不要 Intefaces 13年9月17日火曜日
  • 21. import ( "fmt" "strconv" ) func main() { // エラーの可能性がある関数は複数の値を返す関数となっている i, err := strconv.Atoi("102") if err != nil { //変換失敗時の処理 fmt.Println("Cannot parse : ", err) return } fmt.Println("Parsed: ", i) } Errors // 多値を受け取りerror型がnilか否かでエラー判定する // errorインタフェースは下記の通り type error interface { Error() string } // panic/recoverという仕組みもあるが、致命的なエラーの場合のみに使用される 13年9月17日火曜日
  • 22. go someFunc() // someFuncが別のgoroutineで実行される //goステートメントは独立したgoroutine(スレッド)として //関数またはメソッドを同一アドレス空間内で行う //返り値は取得できない(破棄される) goroutine 13年9月17日火曜日
  • 23. // goにより並行処理の実行自体は容易になった // 並行処理した結果をまとめる部分はchannelを使う // channelはチャネルオペレータの <- を用いて値の送受信ができる直通ルートの型 // アクターモデルで言うメールボックス、JavaだとLinkedBlockingQueueなど… // ロックによる排他制御も可能だが普通は使わない c := make(chan int) // intのチャンネルを作成 c <- 3 // 3をchannelに送る。cの受信準備ができるまでブロック v := <-c //cに値が来るまでブロックし、値が来れば受け取る c := make(chan int, 100) //受信バッファを最大100件とする goroutine / channel 13年9月17日火曜日
  • 24. // 複数チャンネルからの受信を待つ場合にはselectを使う // switch文と似た文法だが、caseが実行されるのは、 // 指定のchannelが送受信できるとき // それまではブロック select { case c <- x: //channel xから受信出来た場合は下記を計算 x, y = y, x+y case <-quit: // channel quitから受信できたときは処理終了 fmt.Println("quit") return } select 13年9月17日火曜日
  • 25. A tour of Goにない話 13年9月17日火曜日
  • 26. // deferの後に続く式を書く // second()はdeferTest()からリターンする直前に実行される func deferTest() { defer second() first() } // こういうケースで便利 f, _ := os.Open(filename) defer f.Close() //処理終了後に確実に閉じる defer 13年9月17日火曜日
  • 27. // 同一フォルダ内にファイル名_test.go で置くのが一般的 // テスト関数はpublic, 引数には *testing.Tを渡す // テスト実行は go test [ファイル名から.goを除去したもの] // t.Errorまたはt.Fatalが実行されればそのテストは失敗と判断 import ( "testing" ) func TestFizzBuzz(t *testing.T) { if result := FizzBuzz(1); result != 1 { t.Error("Expected : 1, Actual : ", result) } if result := FizzBuzz(3); result != "Fizz" { t.Error("Expected : 3, Actual : ", result) } } テスト 13年9月17日火曜日