ããã«ã¡ã¯äœæ°ïŒ
Goèšèªã®åºæ¬ã«ãã§ã«ç²ŸéããŠããŸããïŒãããªããã®æ¬ã¯ããªãã®ããã§ããMichalis Tsukalosã¯ãèšèªã®æ©èœã瀺ããæç¢ºã§ç°¡åãªèª¬æãè¡ããäŸã瀺ãã广çãªããã°ã©ãã³ã°ãã¿ãŒã³ãææ¡ããŸããGoã®ãã¥ã¢ã³ã¹ãåŠç¿ããããšã§ãèšèªã®ããŒã¿ã¿ã€ããšæ§é ãããã³ããã±ãŒãžã³ã°ãåæå®è¡ããããã¯ãŒã¯ããã°ã©ãã³ã°ãã³ã³ãã€ã©ã®èšèšãæé©åãªã©ãç¿åŸã§ããŸããåç« ã®çµããã«ããè³æãšæŒç¿ã¯ãæ°ããç¥èã匷åããã®ã«åœ¹ç«ã¡ãŸãããŠããŒã¯ãªè³æã¯ãGoã§ã®æ©æ¢°åŠç¿ã«é¢ããç« ã§ãåºæ¬çãªçµ±èšææ³ããååž°ãšã¯ã©ã¹ã¿ãªã³ã°ãŸã§ã説æããŸããåé¡ããã¥ãŒã©ã«ãããã¯ãŒã¯ãããã³ç°åžžæ€åºã®ææ³ã«ã€ããŠåŠç¿ããŸããé©çšã»ã¯ã·ã§ã³ã§ã¯ãGo with DockerãšKubernetesãGitãWebAssemblyãJSONãªã©ã®äœ¿ç𿹿³ãåŠç¿ããŸãã
ãã®æ¬ã¯äœã«ã€ããŠã§ãã
1 «Go » Go , godoc , Go-. , . , Go .
2 «Go » Go . unsafe, , Go- C, C- â Go.
, defer, strace(1) dtrace(1). , Go, Go WebAssembly.
3 « Go» , Go: , -, , , , . !
4 « » Go struct, , , , . , switch, strings math/big, Go « â » XML JSON.
5 « Go » , Go . , , -, , . Go container, , Go .
6 « Go» , init(), Go- syscall, text/template html/template. , , go/scanner, go/parser go/token. Go!
7 « » Go: , . , - Go Go- Delve.
8 « UNIX-, » Go. , flag , UNIX, , bytes, io.Reader io.Writer, Viper Cobra Go. : Go, Go Systems Programming!
9 « Go: , » , â , Go.
, , , sync Go.
10 « Go: » . , ! Go, select, Go, , , sync.Mutex sync.RWMutex. context, , (race conditions).
11 «, » , , - , , Go-, Go-.
12 « Go» net/http , - - Go. http.Response, http.Request http.Transport, http.NewServeMux. , Go -! , Go DNS-, Go gRPC.
13 « : » HTTPS- Go UDP TCP net. , RPC, Go TCP- «» .
14 « Go» Go , , , , , TensorFlow, Go Apache Kafka.
. Go, , Go-, Go-, Go C WebAssembly, Go. 5 6 7. Go- , Go- Go.
Go. 8â11 Go, Go, , . Go.
Go WebAssembly, Docker Go, Viper Cobra, JSON YAML, , , go/scanner go/token, git(1) GitHub, atomic, Go gRPC HTTPS.
, Go-, . : -, , , -, .
2 «Go » Go . unsafe, , Go- C, C- â Go.
, defer, strace(1) dtrace(1). , Go, Go WebAssembly.
3 « Go» , Go: , -, , , , . !
4 « » Go struct, , , , . , switch, strings math/big, Go « â » XML JSON.
5 « Go » , Go . , , -, , . Go container, , Go .
6 « Go» , init(), Go- syscall, text/template html/template. , , go/scanner, go/parser go/token. Go!
7 « » Go: , . , - Go Go- Delve.
8 « UNIX-, » Go. , flag , UNIX, , bytes, io.Reader io.Writer, Viper Cobra Go. : Go, Go Systems Programming!
9 « Go: , » , â , Go.
, , , sync Go.
10 « Go: » . , ! Go, select, Go, , , sync.Mutex sync.RWMutex. context, , (race conditions).
11 «, » , , - , , Go-, Go-.
12 « Go» net/http , - - Go. http.Response, http.Request http.Transport, http.NewServeMux. , Go -! , Go DNS-, Go gRPC.
13 « : » HTTPS- Go UDP TCP net. , RPC, Go TCP- «» .
14 « Go» Go , , , , , TensorFlow, Go Apache Kafka.
. Go, , Go-, Go-, Go C WebAssembly, Go. 5 6 7. Go- , Go- Go.
Go. 8â11 Go, Go, , . Go.
Go WebAssembly, Docker Go, Viper Cobra, JSON YAML, , , go/scanner go/token, git(1) GitHub, atomic, Go gRPC HTTPS.
, Go-, . : -, , , -, .
ãããŠåã³Goãã£ãã«ã«ã€ããŠ
selectããŒã¯ãŒãã䜿çšãããšã第9ç« ã§èŠããããã¯ããã«å€ãã®ããšãè¡ãGoãã€ãã䜿çšããããã€ãã®ãŠããŒã¯ãªæ¹æ³ããããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãGoãã€ãã䜿çšããããŸããŸãªæ¹æ³ã«ã€ããŠåŠç¿ããŸãã
ãã£ãã«ã®ãŒãå€ã¯nilã§ãããéãããã£ãã«ã«ã¡ãã»ãŒãžãéä¿¡ãããšãããã°ã©ã ã¯ãããã¯ã¢ãŒãã«ãªããŸãããã ããéãããã£ãã«ããããŒã¿ãèªã¿åãããšãããšããã®ãã£ãã«ã¿ã€ãã®å€ã¯ãŒãã«ãªããŸãããããã£ãŠããã£ãã«ãéããåŸã¯ããã£ãã«ã«ããŒã¿ãæžã蟌ãããšã¯ã§ããªããªããŸãããèªã¿åãããšã¯ã§ããŸãã
ãã£ãã«ãéããããã«ãããŒã¿ã®ã¿ãåä¿¡ããããã«èšèšããå¿ èŠã¯ãããŸãããããã«ããã£ãã«0ã¯åžžã«ãããã¯ãããŸããã€ãŸãããã£ãã«0ããã®èªã¿åããŸãã¯æžã蟌ã¿ã詊ã¿ããšããã£ãã«ããããã¯ãããŸãããã£ãã«ã®ãã®ããããã£ã¯ããã£ãã«å€æ°ãnilã«èšå®ããŠselectã¹ããŒãã¡ã³ãã®ãã©ã³ããç¡å¹ã«ããå Žåã«éåžžã«åœ¹ç«ã¡ãŸãã
æåŸã«ããŒããã£ãã«ãéããããšãããšãããã°ã©ã ã¯ãããã¯ãåŒãèµ·ãããŸããcloseNilChannel.goã®äŸãèŠãŠã¿ãŸãããã
package main
func main() {
var c chan string
close(c)
}
closeNilChannel.goãå®è¡ãããšã次ã®çµæãçæãããŸãã
$ go run closeNilChannel.go
panic: close of nil channel
goroutine 1 [running]:
main.main()
/Users/mtsouk/closeNilChannel.go:5 +0x2a
exit status 2
ä¿¡å·ãã£ãã«
ã·ã°ããªã³ã°ãã£ãã«ã¯ãã·ã°ããªã³ã°ã«ã®ã¿äœ¿çšããããã£ãã«ã§ããç°¡åã«èšãã°ãä¿¡å·ãã£ãã«ã¯ãå¥ã®ããã°ã©ã ã«äœããéç¥ããããšãã«äœ¿çšã§ããŸããããŒã¿ã®è»¢éã«ã·ã°ããªã³ã°ãã£ãã«ã䜿çšããå¿ èŠã¯ãããŸããã
ã·ã°ããªã³ã°ãã£ãã«ã¯ã第8ç« ã§èª¬æããUNIXä¿¡å·åŠçãšæ··åããªãã§ãã ããããããã¯å®å šã«ç°ãªããã®ã§ãã
ã·ã°ããªã³ã°ãã£ãã«ã䜿çšããã³ãŒãã®äŸã«ã€ããŠã¯ããã®ç« ã®åŸåã§èª¬æããŸãã
ãããã¡ãªã³ã°ããããã£ãã«
ãã®ãµãã»ã¯ã·ã§ã³ã®ãããã¯ã¯ããããã¡ãªã³ã°ããããã€ãã§ãããããã¯ãGoã¹ã±ãžã¥ãŒã©ãŒããžã§ãããã°ãããã¥ãŒã«å ¥ããŠããå€ãã®èŠæ±ãåŠçã§ããããã«ãããã£ãã«ã§ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®åž¯åå¹ ãå¶éããããã®ã»ããã©ãšããŠäœ¿çšã§ããŸãã
ããã«ç€ºãæ¹æ³ã¯æ¬¡ã®ããã«æ©èœããŸãããã¹ãŠã®çä¿¡èŠæ±ã¯ãã£ãã«ã«ãªãã€ã¬ã¯ãããããã£ãã«ãé çªã«åŠçããŸãããã£ãã«ãèŠæ±ã®åŠçãçµäºãããšããã£ãã«ãæ°ããèŠæ±ãåŠçããæºåãã§ããŠãããšããã¡ãã»ãŒãžãå ã®åŒã³åºãå ã«éä¿¡ããŸãããããã£ãŠããã£ãã«ã®ãããã¡å®¹éã¯ããã£ãã«ãä¿åã§ããåæèŠæ±ã®æ°ãå¶éããŸãã
äŸãšããŠbufChannel.goããã°ã©ã ã³ãŒãã䜿çšããŠãã®ã¡ââãœãããèŠãŠãããŸããããã4ã€ã®éšåã«åããŸãããã
bufChannel.goã³ãŒãã®æåã®éšåã¯æ¬¡ã®ããã«ãªããŸãã
package main
import (
"fmt"
)
bufChannel.goãã¡ã€ã«ã®2çªç®ã®éšåã«ã¯ã次ã®Goã³ãŒããå«ãŸããŠããŸãã
func main() {
numbers := make(chan int, 5)
counter := 10
ããã«ç€ºãããŠããæ°å€ã®å®çŸ©ã«ããããã®ãã€ãã«æå€§5ã€ã®æŽæ°ãæ ŒçŽã§ããŸãã
bufChannel.goã®3çªç®ã®éšåã«ã¯ã次ã®Goã³ãŒããå«ãŸããŠããŸãã
for i := 0; i < counter; i++ {
select {
case numbers <- i:
default:
fmt.Println("Not enough space for", i)
}
}
ãã®ã³ãŒãã§ã¯ãnumbersãã£ãã«ã«10åã®æ°åãå ¥ããããšããŸããããã ããæ°å€ã«ã¯5ã€ã®æŽæ°ã®ã¹ããŒã¹ãããªãããã10åã®æŽæ°ãã¹ãŠãæ ŒçŽããããšã¯ã§ããŸããã
bufChannel.goã®æ®ãã®Goã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
for i := 0; i < counter+5; i++ {
select {
case num := <-numbers:
fmt.Println(num)
default:
fmt.Println("Nothing more to be done!")
break
}
}
}
ãã®Goã³ãŒãã§ã¯ãforã«ãŒããšselectã¹ããŒãã¡ã³ãã䜿çšããŠnumbersãã£ãã«ã®å 容ãèªã¿åãããšããŸãããæ°å€ãã£ãã«ã§èªã¿åããã®ãããéããselectã¹ããŒãã¡ã³ãã®æåã®ãã©ã³ããå®è¡ãããŸããæ°å€ãã£ãã«ã空ã®å Žåãããã©ã«ãã®åå²ãå®è¡ãããŸãã
bufChannel.goãå®è¡ãããšã次ã®çµæãçæãããŸãã
$ go run bufChannel.go
Not enough space for 5
Not enough space for 6
Not enough space for 7
Not enough space for 8
Not enough space for 9
0
1
2
3
4
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
ãŒããã£ã³ãã«
ãã®ã»ã¯ã·ã§ã³ã§ã¯ããã£ãã«ãŒãã«ã€ããŠåŠç¿ããŸããããã¯ãåžžã«ãããã¯ãããç¹å¥ãªçš®é¡ã®ãã£ãã«ã§ããäŸãšããŠnilChannel.goããã°ã©ã ã䜿çšããŠããããã®ãã£ãã«ãèŠãŠãããŸããããã4ã€ã®ã³ãŒãã«åå²ããŸãããã
nilChannel.goã®æåã®éšåã¯æ¬¡ã®ããã«ãªããŸãã
package main
import (
"fmt"
"math/rand"
"time"
)
nilChannel.goã®2çªç®ã®éšåã«ã¯ã次ã®Goã³ãŒããå«ãŸããŠããŸãã
func add(c chan int) {
sum := 0
t := time.NewTimer(time.Second)
for {
select {
case input := <-c:
sum = sum + input
case <-t.C:
c = nil
fmt.Println(sum)
}
}
}
ããã§ã¯ãäŸãšããŠaddïŒïŒé¢æ°ã䜿çšããŠããŒããã£ãã«ãã©ã®ããã«äœ¿çšããããã瀺ããŸãã<-tCæŒç®åã¯ãtime.NewTimerïŒïŒã®åŒã³åºãã§æå®ãããæéãã¿ã€ããŒtã®Cãã£ãã«ããããã¯ããŸãã颿°åŒæ°ã§ãããã£ãã«cããã¿ã€ããŒtã«å±ãããã£ãã«tCãšæ··åããªãã§ãã ãããæéãçµéãããšãã¿ã€ããŒã¯tCãã£ãã«ã«å€ãéä¿¡ããtCãã£ãã«ã¯ãselectã¹ããŒãã¡ã³ãã®å¯Ÿå¿ãããã©ã³ãã®å®è¡ãéå§ããŸãããã£ãã«cãnilã«èšå®ããsum倿°ã®å€ã衚瀺ããŸãã
3çªç®ã®nilChannel.goã³ãŒãã¹ããããã¯æ¬¡ã®ããã«ãªããŸãã
func send(c chan int) {
for {
c <- rand.Intn(10)
}
}
sendïŒïŒé¢æ°ã®ç®çã¯ãã©ã³ãã ãªçªå·ãçæãããã£ãã«ãéããŠããéããããããã£ãã«ã«éä¿¡ããããšã§ãã
nilChannel.goã®æ®ãã®Goã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
func main() {
c := make(chan int)
go add(c)
go send(c)
time.Sleep(3 * time.Second)
}
2ã€ã®ãŽã«ãŒãã³ãå®è¡ããã®ã«ååãªæéã確ä¿ããã«ã¯ãtime.SleepïŒïŒé¢æ°ãå¿ èŠã§ãã
nilChannel.goãå®è¡ãããšã次ã®çµæãçæãããŸãã
$ go run nilChannel.go
13167523
$ go run nilChannel.go
12988362
addïŒïŒã®selectã¹ããŒãã¡ã³ãã®æåã®ãã©ã³ããå®è¡ãããåæ°ã¯åºå®ãããŠããªããããnilChannel.goãè€æ°åå®è¡ãããšç°ãªãçµæãçæãããŸãã
ãã£ãã«ãã£ãã«
ãã£ãã«ãã£ãã«ã¯ãéåžžã®å€æ°ã¿ã€ãã®ä»£ããã«ä»ã®ãã£ãã«ãšé£æºããç¹å¥ãªçš®é¡ã®ãã£ãã«å€æ°ã§ãããã ãããã£ãã«ã®ãã£ãã«ã®ããŒã¿ã¿ã€ãã宣èšããå¿ èŠããããŸãããã£ãã«ã®ãã£ãã«ãå®çŸ©ããã«ã¯ã次ã®ã¹ããŒãã¡ã³ãã«ç€ºãããã«ãchanããŒã¯ãŒãã2åç¶ããŠäœ¿çšããŸãã
c1 := make(chan chan int)
ãã®ç« ã§ç޹ä»ããä»ã®ã¿ã€ãã®ãã£ãã«ã¯ããã£ãã«ãã£ãã«ããã人æ°ããã䟿å©ã§ãã
chSquare.goãã¡ã€ã«ã«ãããµã³ãã«ã³ãŒãã䜿çšããŠããã£ãã«ãã£ãã«ã®äœ¿çšã«ã€ããŠèª¬æããŸããããã4ã€ã®éšåã«åããŸãããã
chSquare.goã®æåã®éšåã¯æ¬¡ã®ããã«ãªããŸãã
package main
import (
"fmt"
"os"
"strconv"
"time"
)
var times int
chSquare.goã®2çªç®ã®éšåã«ã¯ã次ã®Goã³ãŒããå«ãŸããŠããŸãã
func f1(cc chan chan int, f chan bool) {
c := make(chan int)
cc <- c
defer close(c)
sum := 0
select {
case x := <-c:
for i := 0; i <= x; i++ {
sum = sum + i
}
c <- sum
case <-f:
return
}
}
intã¿ã€ãã®éåžžã®ãã£ãã«ã宣èšããããããããã£ãã«ãã£ãã«å€æ°ã«æž¡ããŸããæ¬¡ã«ãselectã¹ããŒãã¡ã³ãã䜿çšããŠãéåžžã®intãã£ãã«ããããŒã¿ãèªã¿åãããä¿¡å·ãã£ãã«fã䜿çšããŠé¢æ°ãçµäºããæ©äŒãååŸããŸãã
ãã£ãã«cãã1ã€ã®å€ãèªã¿åã£ãåŸã0ããèªã¿åã£ãã°ããã®æŽæ°å€ãŸã§ã®ãã¹ãŠã®æŽæ°ã®åèšãèšç®ããforã«ãŒããå®è¡ããŸããæ¬¡ã«ãèšç®ãããå€ãintãã£ãã«cã«éä¿¡ããŸããããã§å®äºã§ãã
chSquare.goã®3çªç®ã®éšåã«ã¯ã次ã®Goã³ãŒããå«ãŸããŠããŸãã
func main() {
arguments := os.Args
if len(arguments) != 2 {
fmt.Println("Need just one integer argument!")
return
}
times, err := strconv.Atoi(arguments[1])
if err != nil {
fmt.Println(err)
return
}
cc := make(chan chan int)
ãã®ã³ãŒãã¹ããããã®æåŸã®è¡ã§ãccãšããååã®ãã£ãã«å€æ°ã宣èšããŸãããã¹ãŠãããã«äŸåããŠããã®ã§ããã®å€æ°ã¯ãã®ããã°ã©ã ã®ã¹ã¿ãŒã§ãã cc倿°ã¯f1ïŒïŒã«æž¡ãããæ¬¡ã®forã«ãŒãã§äœ¿çšãããŸãã
chSquare.goGoã³ãŒãã®æ®ãã®éšåã¯æ¬¡ã®ããã«ãªããŸãã
for i := 1; i < times+1; i++ {
f := make(chan bool)
go f1(cc, f)
ch := <-cc
ch <- i
for sum := range ch {
fmt.Print("Sum(", i, ")=", sum)
}
fmt.Println()
time.Sleep(time.Second)
close(f)
}
}
ãã£ãã«fã¯ããã¹ãŠã®äœæ¥ãå®äºãããšãã®ãŽã«ãŒãã³ã®çµäºã®ä¿¡å·ãã£ãã«ã§ãã chïŒ= <-ccåœä»€ã䜿çšãããšããã£ãã«å€æ°ããéåžžã®ãã£ãã«ãååŸããŠãch <-iæŒç®åã䜿çšããŠããã«intå€ãæž¡ãããšãã§ããŸãããã®åŸãforã«ãŒãã䜿çšããŠãã€ãããããŒã¿ãèªã¿åããŸãã f1ïŒïŒé¢æ°ã¯1ã€ã®å€ãè¿ãããã«ããã°ã©ã ãããŠããŸãããè€æ°ã®å€ãèªã¿åãããšãã§ããŸããåiå€ã¯ãç¬èªã®ãŽã«ãŒãã³ã«ãã£ãŠæäŸãããããšã«æ³šæããŠãã ããã
ä¿¡å·ãã£ãã«ã¿ã€ãã¯ãåã®ã³ãŒãã§äœ¿çšãããboolããæ¬¡ã®ã»ã¯ã·ã§ã³ã§ä¿¡å·ãã£ãã«ã«äœ¿çšãããstruct {}ãªã©ãäœã§ãããŸããŸãããã¿ã€ãstruct {}ã®ã·ã°ããªã³ã°ãã£ãã«ã®äž»ãªå©ç¹ã¯ããã®ãããªãã£ãã«ã«ããŒã¿ãéä¿¡ã§ããªãããšã§ããããã«ããããšã©ãŒã®çºçã鲿¢ãããŸãã
chSquare.goãå®è¡ãããšã次ã®ãããªçµæãåŸãããŸãã
$ go run chSquare.go 4
Sum(1)=1
Sum(2)=3
Sum(3)=6
Sum(4)=10
$ go run chSquare.go 7
Sum(1)=1
Sum(2)=3
Sum(3)=6
Sum(4)=10
Sum(5)=15
Sum(6)=21
Sum(7)=28
ãŽã«ãŒãã³ã®å®è¡é åºã®éžæ
ãŽã«ãŒãã³ã®å®è¡é åºã«ã€ããŠã¯ãäœãæ³å®ããå¿ èŠã¯ãããŸããããã ãããã®é åºãå¶åŸ¡ããå¿ èŠãããå ŽåããããŸãããã®ãµãã»ã¯ã·ã§ã³ã§ã¯ãã·ã°ããªã³ã°ãã£ãã«ã䜿çšããŠãããè¡ãæ¹æ³ãåŠç¿ããŸãã
ãéåžžã®é¢æ°ã§åãããšãè¡ãæ¹ãã¯ããã«ç°¡åãªã®ã«ããªããŽã«ãŒãã³ãäœæããŠãããæå®ãããé åºã§å®è¡ããã®ã§ããïŒããšè³ªåãããããããŸãããçãã¯ç°¡åã§ãããŽã«ãŒãã³ã¯åæã«å®è¡ããŠä»ã®ãŽã«ãŒãã³ãå®äºããã®ãåŸ ã€ããšãã§ããŸããã颿°ã¯é çªã«å®è¡ãããããã§ããŸããã
ãã®ãµãã»ã¯ã·ã§ã³ã§ã¯ãdefineOrder.goãšããGoããã°ã©ã ã«ã€ããŠèª¬æããŸããããã5ã€ã®éšåã«åããŸããããdefineOrder.goã®æåã®éšåã¯æ¬¡ã®ããã«ãªããŸãã
package main
import (
"fmt"
"time"
)
func A(a, b chan struct{}) {
<-a
fmt.Println("A()!")
time.Sleep(time.Second)
close(b)
}
颿°AïŒïŒã¯ããã©ã¡ãŒã¿ãŒaã«æ ŒçŽãããŠãããã£ãã«ã«ãã£ãŠããã¯ãããŠããŸãããã®ãã£ãã«ãmainïŒïŒã§ããã¯è§£é€ããããšããã«ãAïŒïŒæ©èœãæ©èœãå§ããŸããæåŸã«ããã£ãã«bãéããŠãå¥ã®é¢æ°ïŒãã®å Žåã¯BïŒïŒïŒã®ãããã¯ãè§£é€ããŸãã
defineOrder.goã®2çªç®ã®éšåã«ã¯ã次ã®Goã³ãŒããå«ãŸããŠããŸãã
func B(a, b chan struct{}) {
<-a
fmt.Println("B()!")
close(b)
}
颿°BïŒïŒã®ããžãã¯ã¯AïŒïŒã®ããžãã¯ãšåãã§ãããã®æ©èœã¯ããã£ãã«aãéãããããŸã§ãããã¯ãããŸããæ¬¡ã«ããã®åœ¹å²ãæããããã£ãã«bãéããŸãããã£ãã«aããã³bã¯é¢æ°ãã©ã¡ãŒã¿ãŒåãåç §ããããšã«æ³šæããŠãã ããã
defineOrder.goã®3çªç®ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
func C(a chan struct{}) {
<-a
fmt.Println("C()!")
}
CïŒïŒé¢æ°ã¯ãããã¯ããããã£ãã«aãéããã®ãåŸ ã£ãŠããéå§ããŸãã
defineOrder.goã®4çªç®ã®éšåã«ã¯ã次ã®ã³ãŒããå«ãŸããŠããŸãã
func main() {
x := make(chan struct{})
y := make(chan struct{})
z := make(chan struct{})
ãããã®3ã€ã®ãã£ãã«ã¯ã3ã€ã®æ©èœã®ãã©ã¡ãŒã¿ãŒã«ãªããŸãã
defineOrder.goã®æåŸã®ã¹ããããã«ã¯ã次ã®Goã³ãŒããå«ãŸããŠããŸãã
go C(z)
go A(x, y)
go C(z)
go B(y, z)
go C(z)
close(x)
time.Sleep(3 * time.Second)
}
ããã§ãããã°ã©ã ã¯å¿ èŠãªãã¹ãŠã®æ©èœãå®è¡ããŠãããxãã£ãã«ãéãã3ç§éã¹ãªãŒãããŸãã
defineOrder.goãå®è¡ãããšãCïŒïŒé¢æ°ãè€æ°ååŒã³åºãããŠããç®çã®çµæãåŸãããŸãã
$ go run defineOrder.go
A()!
B()!
C()!
C()!
C()!
CïŒïŒã¯ãã£ãã«ãéããªãããããŽã«ãŒãã³ãšããŠCïŒïŒãè€æ°ååŒã³åºããŠãåé¡ã¯çºçããŸããããã ããAïŒïŒãŸãã¯BïŒïŒãè€æ°ååŒã³åºããšã次ã®ãããªãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããå¯èœæ§ããããŸãã
$ go run defineOrder.go
A()!
A()!
B()!
C()!
C()!
C()!
panic: close of closed channel
goroutine 7 [running]:
main.A(0xc420072060, 0xc4200720c0)
/Users/mtsouk/Desktop/defineOrder.go:12 +0x9d
created by main.main
/Users/mtsouk/Desktop/defineOrder.go:33 +0xfa
exit status 2
ã芧ã®ãšãããããã§ã¯AïŒïŒé¢æ°ã2ååŒã³åºãããŸããããã ããAïŒïŒããã£ãã«ãéãããšããã®ãŽã«ãŒãã³ã®1ã€ããã£ãã«ããã§ã«éããããŠããããšãæ€åºãããã®ãã£ãã«ãåã³éããããšãããšãããã¯ç¶æ ã«ãªããŸããBïŒïŒé¢æ°ãè€æ°ååŒã³åºãããšãããšãåæ§ã®ãããã¯ç¶æ ã«ãªããŸãã
ãŽã«ãŒãã³ã䜿ããªãæ¹æ³
ãã®ã»ã¯ã·ã§ã³ã§ã¯ããŽã«ãŒãã³ã䜿çšããŠèªç¶æ°ãäžŠã¹æ¿ããçŽ æŽãªæ¹æ³ãåŠç¿ããŸãããããã説æããããã°ã©ã ã¯ãsillySort.goãšåŒã°ããŸããããã2ã€ã®éšåã«åããŸããããsillySort.goã®æåã®éšåã¯æ¬¡ã®ããã«ãªããŸãã
package main
import (
"fmt"
"os"
"strconv"
"sync"
"time"
)
func main() {
arguments := os.Args
if len(arguments) == 1 {
fmt.Println(os.Args[0], "n1, n2, [n]")
return
}
var wg sync.WaitGroup
for _, arg := range arguments[1:] {
n, err := strconv.Atoi(arg)
if err != nil || n < 0 {
fmt.Print(". ")
continue
}
sillySort.goã®2çªç®ã®éšåã«ã¯ã次ã®Goã³ãŒããå«ãŸããŠããŸãã
wg.Add(1)
go func(n int) {
defer wg.Done()
time.Sleep(time.Duration(n) * time.Second)
fmt.Print(n, " ")
}(n)
}
wg.Wait()
fmt.Println()
}
äžŠã¹æ¿ãã¯ãtime.SleepïŒïŒé¢æ°ãåŒã³åºãããšã«ãã£ãŠå®è¡ãããŸã-èªç¶æ°ã倧ããã»ã©ãfmt.PrintïŒïŒæŒç®åãå®è¡ããããŸã§ã«æéãããããŸãïŒ
sillySort.goãå®è¡ãããšã次ã®ãããªçµæãçæãããŸãã
$ go run sillySort.go a -1 1 2 3 5 0 100 20 60
. . 0 1 2 3 5 20 60 100
$ go run sillySort.go a -1 1 2 3 5 0 100 -1 a 20 hello 60
. . . . . 0 1 2 3 5 20 60 100
$ go run sillySort.go 0 0 10 2 30 3 4 30
0 0 2 3 4 10 30 30
èè ã«ã€ããŠ
Mihalis Tsoukalosã¯ãUNIX管çè ãããã°ã©ããŒãããŒã¿ããŒã¹ç®¡çè ãããã³æ°åŠè ã§ããæè¡çãªæ¬ãèšäºãæžãã®ã奜ãã§ãäœãæ°ããããšãåŠã³ãŸãããã®æ¬ã«å ããŠãMichalisã¯ãGo Systems ProgrammingãšãSys AdminãMacTechãLinux User and DeveloperãUsenixãloginïŒãLinux FormatãLinuxJournalãªã©ã®å€ãã®éèªã«250ãè¶ ããæè¡èšäºãæžããŠããŸããMichalisã®ç 究察象ã¯ãããŒã¿ããŒã¹ãèŠèŠåãçµ±èšãããã³æ©æ¢°åŠç¿ã§ãã
ç§åŠç·šéè ã«ã€ããŠ
Mat Ryerã¯ã6æ³ããã³ã³ãã¥ãŒã¿ãŒããã°ã©ã ãäœæããŠããŸããæåã¯ZX Spectrumã®BASICã§ã次ã«ç¶èŠªãšäžç·ã«AmigaBASICãšAmosã®CommodoreAmigaã§äœæããŸããã圌ã¯ãAmiga Formatãã¬ãžã³ããã³ãŒããæåã§ã³ããŒãã倿°ãŸãã¯GOTOã¹ããŒãã¡ã³ãåç §ã®å€ã倿ŽããŠäœãèµ·ãã£ãã®ãã確èªããããã«å€ãã®æéãè²»ãããŸãããåãæ¢æ±å¿ãšããã°ã©ãã³ã°ãžã®å·çã«ããã18æ³ã®ãããã¯è±åœã®ãã³ã¹ãã£ãŒã«ãã«ããå°å ã®çµç¹ã§åããããã§ãŠã§ããµã€ãããã®ä»ã®ãªã³ã©ã€ã³ãµãŒãã¹ã®æ§ç¯ãå§ããŸããã
ãã³ãã³ã ãã§ãªãäžçäžã®ããŸããŸãªåéã§ããŸããŸãªãã¯ãããžãŒãæ°å¹Žé䜿çšããåŸããããã¯ãGoogleã§æåã«äœ¿çšãããGoãšåŒã°ããæ°ããã·ã¹ãã ããã°ã©ãã³ã°èšèªã«æ³šæãåããŸããã Goã¯éåžžã«é¢é£æ§ã®é«ãæå ç«¯ã®æè¡çåé¡ã解決ããŠãããããMatã¯ãGoããŸã ããŒã¿çã§ãã£ããšãã«åé¡è§£æ±ºã«ãã®èšèªã䜿ãå§ãããã以æ¥ããã°ã©ã ãç¶ããŠããŸãã Matã¯ããŸããŸãªãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«åãçµã¿ãTestifyãMoqãSilk and IsãMacOSéçºè ããŒã«ãããBitBarãªã©ã®ããã€ãã®Goããã±ãŒãžãäœæããŸããã
2018幎以æ¥ãMatã¯Machine Boxã®å ±ååµèšè ã§ãããããã§ãäŒè°ã«åå ããGoã«ã€ããŠããã°ã«æžã蟌ã¿ãGoã³ãã¥ããã£ã®ç©æ¥µçãªã¡ã³ããŒã§ãã
»æ¬ã®è©³çްã«ã€ããŠã¯ãçºè¡å ã®Webãµã€ããåç §ããŠãã ãã
Â»ç®æ¬¡
» äœæ°åãã®æç²
ã¯ãŒãã³ã®25ïŒ å²åŒ-Golang
çŽçã®æ¬ã®æ¯æãæã«ãé»åæžç±ãé»åã¡ãŒã«ã«éä¿¡ãããŸãã