Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goの文法の実例と解説

 Goの文法の実例と解説

スライド「Go一緒にいかが?」の資料2

Ryuji Iwata

December 23, 2014
Tweet

More Decks by Ryuji Iwata

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 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 } 「様々な型」
  4. 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 }
  5. 「フロー制御」 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:
  6. // 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!") } 「可変引数」
  7. 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)
  8. 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!")) }