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

初級者向けGoの落とし穴と解説 / Traps and Explanations in Go

初級者向けGoの落とし穴と解説 / Traps and Explanations in Go

Go(Un)Conference(Goあんこ)LT大会 3kg
https://gounconference.connpass.com/event/92794/

資料中の参考リンクなどは以下にまとめてあります。
https://budougumi0617.github.io/2018/07/26/presentation-gounco-lt3/

Yoichiro Shimizu

July 26, 2018
Tweet

More Decks by Yoichiro Shimizu

Other Decks in Technology

Transcript

  1. • 清水 陽一郎 @budougumi0617 • freee 株式会社 ◦ Backend /

    Desktop-App Engineer ◦ Go / Ruby on Rails / .NET • golang.tokyo 運営 • Blog ◦ https://budougumi0617.github.io/ 自己紹介
  2. Today’s contents About Gopher 00 How to study Go Traps

    and explanations Today’s summary 01 02 03
  3. 例:曖昧な理解だとハマること1 package main import "fmt" func add(a []int) { a

    = append(a, 4) fmt.Printf("%v\n", a) // [1 2 3 4] } func main() { a := []int{1, 2, 3} fmt.Printf("%v\n", a) // [1 2 3] add(a) fmt.Printf("%v\n", a) // [1 2 3] } https://play.golang.org/p/A8fouhhtLQZ 呼び出し先で 引数sliceを appendする 01. How to study Go
  4. 例:曖昧な理解だとハマること2 package main import ( "fmt" ) func main() {

    go fmt.Println("go!") } https://play.golang.org/p/PUoHxeT-RJu main goroutineが 先に死んで 何も起きない @GROOVEX_SWのGoクイズより 01. How to study Go
  5. What can we do? • 必要なのは体系的な仕様の学習 • だけど全部は難しい • •

    愚者は経験に学び、賢者は歴史に学ぶ 01. How to study Go
  6. { 引用元 - プログラミング言語Go • Pros ◦ 日本語書籍で一番体系的 ◦ 設計思想にも言及している

    • Cons ◦ ~ Go1.6なので contextなどは未言及 ◦ database/sql等も薄い 01. How to study Go
  7. Loop with defer package main import ( "fmt" ) func

    useHeavyResource() { for i := 0; i < 5; i++ { defer func() { fmt.Println("Released") }() // Do something with resource } fmt.Println("Finished") } func main() { useHeavyResource() } https://play.golang.org/p/q_V9E1H5Jhy What output? 02. Traps and explanations
  8. Map package main import ( "fmt" ) type s struct

    { i int s []string } func main() { m := new(map[s]string) fmt.Printf("%v\n", m) } https://play.golang.org/p/rKforjFi2CW Why error? 02. Traps and explanations
  9. Interface package main import ( "bytes" "io" ) func log(buf

    io.Writer, s string) { if buf != nil { buf.Write([]byte(s)) } } func main() { var b *bytes.Buffer = nil log(b, "foo") } https://play.golang.org/p/QzK9wJQXwcS Why panic? 02. Traps and explanations
  10. Captured value package main import ( "fmt" "time" ) func

    main() { for i := 0; i < 5; i++ { go func() { fmt.Printf("%d", i) }() } time.Sleep(2 * time.Second) } https://play.golang.org/p/24O7H2cQZLf Where is problem? 02. Traps and explanations
  11. Local variable 1 package main import ( "fmt" ) func

    main() { x := "hello" for _, x := range x { x := x + 'A' - 'a' fmt.Printf("%c", x) } } https://play.golang.org/p/ljulBLJZs6k Compilable? 02. Traps and explanations
  12. Local variable 2 package main import ( "fmt" ) func

    main() { if x := 10; x == -1 { // do something... } else if y := 20; y == -1 { // do something... } else { fmt.Printf("%d %d", x, y) } } https://play.golang.org/p/6NH44WjXOz- Compilable? 02. Traps and explanations
  13. Size of empty struct is zero package main import (

    "fmt" "reflect" ) func main() { var i int var s struct{} fmt.Printf("%v\n", reflect.TypeOf(i).Size()) // 4 fmt.Printf("%v\n", reflect.TypeOf(s).Size()) // 0 } https://play.golang.org/p/nZqAFEZs48J チャネルの型は重 要ではありません ので、大きさがゼロ であるstruct{}を 使います。 P278 8.6 例:平行ウェブクローラ 02. Traps and explanations
  14. 公開されていない フィールドもリフレ クションでは見える ことに注意してくだ さい。 Visibility private field package main

    import ( "fmt" "os" "reflect" ) func main() { v := reflect.ValueOf(os.Stderr) // os.File.(*file).name fmt.Printf("%v\n", v.Elem().Field(0).Elem().FieldByName("name")) } https://play.golang.org/p/u8-5-kWyzGI P387 12.3 Display:再帰的な値の表示 02. Traps and explanations