Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Goの文法の実例と解説

Avatar for Ryuji Iwata Ryuji Iwata
December 23, 2014

 Goの文法の実例と解説

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

Avatar for Ryuji Iwata

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!")) }