Slide 1

Slide 1 text

Introduce Go by C Programmer Go 1.9 Release Party in Tokyo @sonatard

Slide 2

Slide 2 text

ࣗݾ঺հ • @sonatard • 2006 - ֶੜ࣌୅ • ֶ෦ͷLinuxαʔόΠϯϑϥߏஙɺӡ༻ • 2010 - ϝʔΧʔ • SystemC - ແઢLANϞδϡʔϧγϛϡϨʔλ։ൃ • Cݴޠ - RTOSͷTCP/IPϓϩτίϧελοΫ։ൃ • Java - Jenkins͓͡͞ΜɺϓϥάΠϯ։ൃ • 2014 - झຯͰGo ghq΁ͷPR͕GoσϏϡʔɻghs, go-ldapc • 2017 - ϝϧΧϦ/ι΢κ΢ • Google App Engine Go αʔόαΠυΤϯδχΞ

Slide 3

Slide 3 text

Why not X golang? • genericsͳ͍ͷʁ • map/filterͳ͍ͷʁ • setͳ͍ͷʁ • ྫ֎ͳ͍ͷʁ • XXXXͳ͍ͷʁ

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Why no X Go? • genericsͳ͍ͷʁ • map/filterͳ͍ͷʁ • setͳ͍ͷʁ • ྫ֎ͳ͍ͷʁ • ɾɾɾɾͳ͍ͷʁ CݴޠϓϩάϥϚ͸ ؾʹͳΒͳ͍ ݩʑͳ͍ map/filterͲ͜Ζ͔list΋ͳ͍

Slide 6

Slide 6 text

Go is great for C programmer • ॆ࣮ͨ͠ඪ४ϥΠϒϥϦ • ίϯύΠϧͷ༰қ͞ • ެࣜϑΥʔϚολʔ • ඪ४ͷϢχοτςετπʔϧ • ΫϩείϯύΠϧɺϚϧνϓϥοτϑΥʔϜରԠ • ෳ਺ฦΓ஋ʹΑΔerrno͔Βͷ୤٫ • ΠϯλʔϑΣʔεʹΑΔΦϒδΣΫτࢦ޲ͷ࣮ݱ • GC(Garbage Collection) • ελοΫ΍ώʔϓΛҙࣝ͠ͳ͍ϓϩάϥϛϯά • ੔਺࢓༷ͷ੔ཧ

Slide 7

Slide 7 text

Go is great for C programmer • ॆ࣮ͨ͠ඪ४ϥΠϒϥϦ • ίϯύΠϧͷ༰қ͞ • ެࣜϑΥʔϚολʔ • ඪ४ͷϢχοτςετπʔϧ • ΫϩείϯύΠϧɺϚϧνϓϥοτϑΥʔϜରԠ • ෳ਺ฦΓ஋ʹΑΔerrno͔Βͷ୤٫ • ΠϯλʔϑΣʔεʹΑΔΦϒδΣΫτࢦ޲ͷ࣮ݱ • GC(Garbage Collection) • ελοΫ΍ώʔϓΛҙࣝ͠ͳ͍ϓϩάϥϛϯά • ੔਺࢓༷ͷ੔ཧ ϙδςΟϒͳཁૉ͔͠ ͳ͍

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

Go is similar to C • จ๏ • ࢓༷΋CΛݩʹॻ͔Ε͍ͯͨΓ͢Δͱ͜Ζ΋ • ͳͥʁ

Slide 10

Slide 10 text

Go Designer • Rob Pike • Unixͷ։ൃऀ • Ken Thompson • Cݴޠͷ։ൃऀ

Slide 11

Slide 11 text

Goͷݴޠઃܭ • Go = Cݴޠ+ α - β

Slide 12

Slide 12 text

Go = Cݴޠ + α α = ௥Ճͱมߋ • printf • for loop • switch • Scope • Zero Initialization • Error Handling • ޙஔه๏ • select • ະఆٛಈ࡞ • ͦͷଞ

Slide 13

Slide 13 text

printf • fmt.Printf͍͍ΑͶ • %v, %+v, %#v ࠷ߴ

Slide 14

Slide 14 text

for loop • Cݴޠ • Go for (i = 0; i < sizeof(array)/sizeof(array[0]); i++) for i, v := range array {}

Slide 15

Slide 15 text

switch • GoͰ͸switchͷcaseʹifͱಉ༷೚ҙͷ৚݅ࣜΛॻ͘ ͜ͱ͕Ͱ͖Δɻ • CݴޠͰ͸ɺఆ਺ͷΈ a := 100 switch { case a > 80: fmt.Println("over 80") default: fmt.Println("under 80") }

Slide 16

Slide 16 text

Scope • for • if // Cݴޠ(C89) int i; for (i = 0; i < 10; i++ ) {} // Go for i := 0; i < 10; i++ {} // Cݴޠ err = funcX() if (err < 0) {} // είʔϓ͕࿙ΕΔ // Go if err := funcX(); err != nil { // errͷείʔϓ͕ด͡Δ }

Slide 17

Slide 17 text

Zero initialization • Cݴޠ • ؔ਺ͷϩʔΧϧม਺ɹෆఆ஋ • άϩʔόϧม਺ 0 • staticม਺ 0 • Go • ͢΂ͯθϩॳظԽ

Slide 18

Slide 18 text

Error handling • CݴޠͰ͸ • ΤϥʔॲཧΛ๨ΕΔ͜ͱ͕ଟ͍ • ฦΓ஋ΛແࢹͰ͖Δɻ • intͷฦΓ஋ʹҙຯ͕͋ΔͨΊɺ஋ʹԠͨ͡໢ཏతͳΤϥʔॲཧ͕ඞཁɻ • ੔਺ͳΒड৴ͨ͠σʔλαΠζɺ0ະຬͳΒΤϥʔɺ0͸ɾɾɾ • Τϥʔͷৄࡉ͸ɺάϩʔόϧม਺ͷerrnoΛݟͳ͚Ε͹͍͚ͳ͍͜ͱ΋ • 1ͭͷม਺ʹෳ਺ͷҙຯ߹͍Λ͍࣋ͨͤͯͨɻΤϥʔઐ༻ͷܕ͕ͳ͍ɻ • τϨʔε৘ใ͕ͳ͍ ret = recv( fd, buf, sizeof(buf), 0 );

Slide 19

Slide 19 text

Error handling • GoݴޠͰ͸ • ΤϥʔॲཧΛ๨ΕΔ͜ͱ͕೉͍͠ • ໌ࣔతͳແࢹ͕ඞཁ • ݁ՌͷฦΓ஋ͱΤϥʔͷ஋͸෼཭͞Ε͍ͯΔ • Τϥʔͷৄࡉ͸ɺerrͷ஋Ͱ֬ೝɻ • error InterfaceͰऔΓճ͕͠ྑ͍ɻ • τϨʔε৘ใ΋४ඪ४ϥΠϒϥϦͷerrorsͰ௥ՃՄೳ n, err := conn.Read(buf) n, _ := conn.Read(buf) err1 := errors.Wrap(err, "XXX Error") fmt.Printf("%v", err1)

Slide 20

Slide 20 text

ޙஔه๏ • ͜ΕಡΊ·͔͢ʁ • Cݴޠ int (*(*a)(int (*)(int, int), int))(int, int)

Slide 21

Slide 21 text

ޙஔه๏ • Go͸ಡΈ΍͍͢ • Cݴޠ • Go int (*(*a)(int (*)(int, int), int))(int, int) a func(func(int, int) int, int) func(int, int) int

Slide 22

Slide 22 text

ޙஔه๏ • Cݴޠ • Go • ౴͑ • ҎԼͷΑ͏ͳؔ਺ͷม਺aΛએݴ • Ҿ਺1: int,intΛҾ਺ʹऔΓฦΓ஋͕intͳؔ਺ • Ҿ਺2: int • ฦΓ஋: int,intΛҾ਺ʹऔΓฦΓ஋͕intͳؔ਺ int (*(*a)(int (*)(int, int), int))(int, int) a func(func(int, int) int, int) func(int, int) int

Slide 23

Slide 23 text

select • Goʹ͸ɺଞͷݴޠͰ͸ݟ͔͚ͳ͍selectͱ͍ ͏ߏจ͕͋Δɻ(filterͱͯ͠ͷselectͰ͸ͳ͍) • ඇಉظॲཧͷ݁ՌΛ଴ͪड͚ΔͨΊʹ࢖͏ɻ for { select { case ch1 <- v: fmt.Println("ch1") case ch2 <- v: fmt.Println("ch2") default: fmt.Println("default") } }

Slide 24

Slide 24 text

select • Cݴޠʹ΋ඇಉظॲཧͷ݁ՌΛड͚औΔͨΊʹ ࢖͏selectͱ͍͏ؔ਺͕͋Δɻ • ར༻໨త͸Goͱಉ͡ɻ // આ໌ʹඞཁͳ͍ཁૉ͸ল͍͍ͯΔͷͰҎԼ͸ಈ͖·ͤΜ while (1) { select(maxfd+1, &fds, NULL, NULL, NULL); if (FD_ISSET(sock1, &fds)) { printf("sock1\n"); } if (FD_ISSET(sock2, &fds)) { printf("sock2\n"); } }

Slide 25

Slide 25 text

ະఆٛಈ࡞ • Cݴޠͷະఆٛಈ࡞͸ɺίϯύΠϧΤϥʔʹͳΒͣίϯύΠϥͰ͸ ҰఆͷڍಈΛࣔ͢͜ͱ͕ଟ͍ͷͰɺόάʹؾ͕෇͖ʹ͍͘ɻ • ಉ͡ιʔείʔυͰ΋ଞͷίϯύΠϥͰ͸·ͬͨ͘ผͷڍಈΛ͢Δ Մೳੑ͕͋Δɻ • ྫ)ූ߸෇͖੔਺ͷΦʔόʔϑϩʔ • Cݴޠ ະఆٛ(ྫ֎ɺϥοϓΞϥ΢ϯυɺͦͷଞ͢΂ͯͷՄೳੑ) • Go ϥοϓΞϥ΢ϯυ

Slide 26

Slide 26 text

ͦͷଞ • Ϗϧυ؆୯(gcc, ld, ar... autoconf, make...)→go build • OSґଘਏ͍(windows, linux, mac rtos)→ڞ௨ίʔυ • ΫϩείϯύΠϧਏ͍ˠઐ༻ίϯύΠϥˠgo build • ίϯύΠϥґଘਏ͍(gcc, arm ,extensa)→goެࣜίϯύΠϥ1͚ͭͩ

Slide 27

Slide 27 text

Go = Cݴޠ - β β = ෆཁͳػೳͷ࡟আ • ϝϞϦΞυϨεૢ࡞ • 3߲ԋࢉࢠ • ҉໧తܕมߋ • ੔਺֦ு

Slide 28

Slide 28 text

ϝϞϦΞυϨεૢ࡞ • ੬ऑੑͷݪҼ • ਺ʑͷ੬ऑੑΛੜΈग़͖ͯͨ͠ɻࠓ΋ੜΈग़͠ଓ͚͍ͯΔɻ • ্هͷΑ͏ʹsize͕ݻఆͳΒϛε͸গͳ͍͕ɺύέοτΛύʔεͯ͠αΠ ζΛऔಘ͢Δ৔߹ͳͲ͸ةݥɻ • ύέοτ͕ૹ͖ͬͯͨαΠζΛ৴༻ͯ͠͸͍͚ͳ͍ɻ int a[5]; int b[10]; int *p = &a; // b͔Βaʹ10byteίϐʔɻ // όοϑΝΦʔόʔϑϩʔ memcpy(a, b, sizeof(b))

Slide 29

Slide 29 text

ࡾ߲ԋࢉࢠ • if จ͕1ߦʹͳΔ • ࡾ߲ԋࢉࢠ͸গ͠ಡΈͮΒ͍ • GoͰ͸ࡾ߲ԋࢉࢠ͸࡟আ • ifͰΑ͠ɹ int a = (x > 1) ? 10 : 5 var a int if x > 1 { a = 10 } else { a = 5 }

Slide 30

Slide 30 text

Cݴޠͷ҉໧తܕม׵ • ܕ͕ҟͳΔ஋ͷൺֱ // Cݴޠ int a = -1; unsigned int b = 1; if (a < b) { printf("a < b"); } else { printf("a > b"); } // Go var a int = -1 var b uint = 1 if a < b { fmt.Println("a < b") } else { fmt.Println("a > b") }

Slide 31

Slide 31 text

Cݴޠͷ҉໧తܕม׵ • Cݴޠ : ූ߸ແ͠੔਺ܕΛ࣋ͭΦϖϥϯυ͕ɺଞํͷΦϖϥϯυͷ੔਺ม׵ ͷॱҐΑΓߴ͍ຢ͸౳͍͠ॱҐΛ΋ͭͳΒ͹ɺූ߸෇͖੔਺ܕΛ΋ͭΦϖ ϥϯυΛɺූ߸ແ͠੔਺ܕΛ΋ͭΦϖϥϯυͷܕʹม׵͢Δɻ • Go : ҉໧తܕม׵͸ͳ͍ɻܕ͕ҟͳΔ΋ͷಉ࢜ͷԋࢉ͸ίϯύΠϧΤϥʔ // Cݴޠ int a = -1; unsigned int b = 1; // int a = -1͸ɺ // unsigned intͷ4,294,967,295 // ʹม׵͞ΕΔ if (a < b) { printf("a < b"); } else { printf("a > b"); } // ग़ྗ݁Ռ a > b // Go var a int = -1 var b uint = 1 if a < b { fmt.Println("a < b") } else { fmt.Println("a > b") } // main.go:10: // invalid operation: a < b // (mismatched types int and uint)

Slide 32

Slide 32 text

੔਺֦ு • Cݴޠͷ੔਺֦ு • ܭࢉ్தͷ஋͕Φʔόʔϑϩʔ͢Δ͜ͱͰࢉज़Τ ϥʔ͕ى͜ΔͷΛ๷͙ short a = 32767;ɹ// shortͷ࠷େ஋ short b = 1; int c = a + b; // ্هͷߦ͸ҎԼͷΑ͏ʹॲཧ͞Ε·͢ɻ // int c = (int)a + (int)b short d = a + b; // ্هͷߦ͸ҎԼͷΑ͏ʹॲཧ͞Ε·͢ɻ // short d = (short)((int)a + (int)b) printf("int c = %d ",c); printf("short d = %d",d); // int c = 32768 short d = -32768

Slide 33

Slide 33 text

੔਺֦ு • Goݴޠͷ੔਺֦ு • ػೳͱͯ͠ଘࡏ͠ͳ͍ • Better C - Goݴޠͱ੔਺ #golang • http://qiita.com/sonatard/items/464a9d45c689386edfe1 var a int16 = 32767 // int16ͷ࠷େ஋ var b int16 = 1 var c int32 // a + b ͸ int16Ͱܭࢉ͞ΕΔ c = int32(a + b) // ҉໧ͷܕม׵͕ͳ͍ͨΊΩϟετ͠ͳ͍ͱΤϥʔ fmt.Println(c) // -32768

Slide 34

Slide 34 text

·ͱΊ • Go࠷ߴ • ϓϩάϥϛϯάݴޠ Go • Alan A.A. Donovan B.W. Kernighan • Go͸Cݴޠ༝དྷͷ࢓༷΍ػೳ͕ଟ͍ͷͰCΛษڧ͢ΔͱಘΔ΋ͷ͕͋Δ͔΋ • ϓϩάϥϛϯάݴޠC ୈ2൛ ANSIن֨४ڌ • B.W. Kernighan , D.M. Ritchie • ϓϩάϥϛϯά࡞๏ • Brian W. Kernighan, Rob Pike

Slide 35

Slide 35 text

※ • ͢΂ͯͷϢʔεέʔεʹ͓͍ͯCݴޠΑΓGo͕ྑ͍Θ ͚Ͱ͸͋Γ·ͤΜ • ϋʔυ΢ΣΞͷϨδελΛૢ࡞͢Δ৔߹΍ɺϝϞϦ Λ׬શʹ؅ཧ͍ͨ͠৔߹ʹ͸Go͸޲͍͍ͯ·ͤΜ • Linux KernelɺυϥΠόͳͲ΋ಉ༷Ͱ͢ • There's no magic

Slide 36

Slide 36 text

Thank you!!