Slide 1

Slide 1 text

Goの文法の実例と解説 オリジナルサイト Learn X in Y minutes http://learnxinyminutes.com/docs/go/ オリジナルソース learngo.go http://learnxinyminutes.com/docs/files/learngo.go ブロック分け 全体で約20のセクションで構成されており、順番に処理を呼び出す記述になっています。 少々長いので、いくつかのブロックに分けて「記述して実行」して行きます。 セクション一覧(ブロックは「記述して実行」する単位) 「Hello world!」 package main import () func main() 「複数の引数や戻り値」 func beyondHello() func learnMultiple(x, y int) (sum, prod int) 「様々な型」 func learnTypes() 「メモリー割り当て」 func learnMemory() (p, q *int) 「フロー制御」 func expensiveComputation() float64 func learnFlowControl() 「遅延実行」 func learnDefer() (ok bool) 「インターフェース」と「構造体」 type Stringer interface type pair struct

Slide 2

Slide 2 text

func (p pair) String() string func learnInterfaces() 「可変引数」 func learnVariadicParams(myStrings ...interface{}) 「エラーハンドリング」 func learnErrorHandling() 「同時実行処理」 func inc(i int, c chan int) func learnConcurrency() 「Webアプリケーション」 func learnWebProgramming() func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) 実際にやってみよう! テキストエディターでlearngo01.goをUTF-8(BOMなし)で作成します。 「Hello world!」 learngo01.go package main import ( "fmt" // m "math" // "net/http" // "strconv" ) func main() { fmt.Println("Hello world!") //beyondHello() } 実行する前にgo fmtコマンドでフォーマットを整形するとよいでしょう。 フォーマットの整形 ~$ go fmt learngo01.go learngo01.go

Slide 3

Slide 3 text

go runコマンドで実行してみましょう。 ソースの実行 ~$ go run learngo01.go Hello world! 以降、learngo01.goにコードの差分を繰り返し「記述して実行」して行きますので、差分を残 したい場合は、ファイルをコピーした後、コピーしたファイルに追記して行って下さい。 ファイルのコピー ~$ cp learngo01.go learngo02.go ~$ ls learngo01.go learngo02.go 以降、便宜上、追加していく差分の内容を「learngo連番.go」で表示してあります。 また、資料の性質上、資料のソースをそのまま「記述して実行」するとエラーになりますの で、その際は、 ● 各関数の呼び出しがコメントアウトされているので有効にする。 ● import句のパッケージ定義がコメントアウトされているので有効にする。 などを行って下さい。 「複数の引数や戻り値」 learngo02.go func beyondHello() { var x int x = 3 y := 4 sum, prod := learnMultiple(x, y) fmt.Println("sum:", sum, "prod:", prod) // learnTypes() } func learnMultiple(x, y int) (sum, prod int) { return x + y, x * y } 「様々な型」

Slide 4

Slide 4 text

learngo03.go func learnTypes() { s := "Learn Go!" s2 := `A "raw" string literal can include line breaks.` g := 'Σ' f := 3.14195 c := 3 + 4i var u uint = 7 var pi float32 = 22. / 7 n := byte('\n') var a4 [4]int a3 := [...]int{3, 1, 5} s3 := []int{4, 5, 9} s4 := make([]int, 4) var d2 [][]float64 bs := []byte("a slice") // p, q := learnMemory() // fmt.Println(*p, *q) m := map[string]int{"three": 3, "four": 4} m["one"] = 1 _, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs fmt.Println(s, c, a4, s3, d2, m) // learnFlowControl() } 「メモリー割り当て」 learngo04.go func learnMemory() (p, q *int) { p = new(int) s := make([]int, 20) s[3] = 7 r := -2 return &s[3], &r }

Slide 5

Slide 5 text

「フロー制御」 learngo05.go func expensiveComputation() float64 { return m.Exp(10) } func learnFlowControl() { if true { fmt.Println("told ya") } if false { // Pout. } else { // Gloat. } x := 42.0 switch x { case 0: case 1: case 42: case 43: } for x := 0; x < 3; x++ { fmt.Println("iteration", x) } for { break continue } if y := expensiveComputation(); y > x { x = y } xBig := func() bool { return x > 10000 } fmt.Println("xBig:", xBig()) x = 1.3e3 fmt.Println("xBig:", xBig()) goto love love:

Slide 6

Slide 6 text

// learnDefer() // learnInterfaces() } 「遅延実行」 learngo06.go func learnDefer() (ok bool) { defer fmt.Println("deferred statements execute in reverse (LIFO) order.") defer fmt.Println("\nThis line is being printed first because") return true } 「インターフェース」と「構造体」 learngo07.go type Stringer interface { String() string } type pair struct { x, y int } func (p pair) String() string { return fmt.Sprintf("(%d, %d)", p.x, p.y) } func learnInterfaces() { p := pair{3, 4} fmt.Println(p.String()) var i Stringer i = p fmt.Println(i.String()) fmt.Println(p) fmt.Println(i) // learnVariadicParams("great", "learning", "here!") } 「可変引数」

Slide 7

Slide 7 text

learngo08.go func learnVariadicParams(myStrings ...interface{}) { for _, param := range myStrings { fmt.Println("param:", param) } fmt.Println("params:", fmt.Sprintln(myStrings...)) // learnErrorHandling() } 「エラーハンドリング」 learngo09.go func learnErrorHandling() { m := map[int]string{3: "three", 4: "four"} if x, ok := m[1]; !ok { fmt.Println("no one there") } else { fmt.Print(x) } if _, err := strconv.Atoi("non-int"); err != nil { fmt.Println(err) } // learnConcurrency() } 「同時実行処理」 learngo10.go func inc(i int, c chan int) { c <- i + 1 } func learnConcurrency() { c := make(chan int) go inc(0, c) go inc(10, c) go inc(-805, c) fmt.Println(<-c, <-c, <-c) cs := make(chan string)

Slide 8

Slide 8 text

ccs := make(chan chan string) go func() { c <- 84 }() go func() { cs <- "wordy" }() select { case i := <-c: fmt.Printf("it's a %T", i) case <-cs: fmt.Println("it's a string") case <-ccs: fmt.Println("didn't happen.") } // learnWebProgramming() } 「Webアプリケーション」 learngo11.go func learnWebProgramming() { err := http.ListenAndServe(":8080", pair{}) fmt.Println(err) } func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte("You learned Go in Y minutes!")) }