Goèšèªã§ã®éçºãããããã«ããŸãã¯ç°å¢æŽåãããŸãããã
å ¬åŒãµã€ãããããèªèº«ã®ç°å¢ã«åãããŠã€ã³ã¹ããŒã©ãããŠã³ããŒãããGoèšèªã®å®è¡ç°å¢ãã€ã³ã¹ããŒã«ããŠãã ããã ããŒãžã§ã³ã¯ææ°(æ¬ã¬ã€ããæžããæç¹ã§ã¯1.12.6)ãã€ã³ã¹ããŒã«ããŠãã ããã
ã€ã³ã¹ããŒã«ãå®äºããããæ¬¡ã®ã³ãã³ãã§Goèšèªã®ããŒãžã§ã³ã確èªããŠãã ããã
$ go version
go version go1.12 darwin/amd64
(macOSãGo1.12ã®å Žå)ã®ããã«è¡šç€ºãããã°OKã§ãã
ç°å¢å€æ°GO111MODULE
ã«on
ãèšå®ããŠãã ãããLinux/macOSã§ã¯ãexport GO111MODULE=on
ãšå®è¡ãã(çŸåšã®ã»ãã·ã§ã³ã«é©çšãã)ãã.bashrcã.zshrcãªã©ã«èšèŒãã(æ°žç¶çã«é©çšãã)ããšã§èšå®ã§ããŸãã
Goèšèªã¯ã奜ã¿ã®ãšãã£ã¿ã§éçºãè¡ãããšãã§ããŸããæ¥åžžçã«äœ¿çšããŠãããšãã£ã¿ãããã°ãã¡ãããã®ãŸãŸäœ¿çšããŠãã ããã äžè¬çã«ããã°ã©ãã³ã°ã§äœ¿çšãããŠãããšãã£ã¿ã§ããã°ãã»ãšãã©ã®å ŽåGoèšèªæ¡åŒµãçšæãããŠããŸãã
- emacs:
go-mode
ãã€ã³ã¹ããŒã«ããŠãã ããã - vim:
vim-go
ãæåãªããã§ãã - Visual Studio Code:
vscode-go
ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŠãã ããã - JetBrains(IntelliJ)ãŠãŒã¶: GoLandã人æ°ã®ããã§ã(ã©ã€ã»ã³ã¹ã«ã€ããŠã¯åèªã確èªãã ããã
æºåãã§ããããæ©éGoèšèªã®ããã°ã©ã ãå®è¡ããŠã¿ãŸãããïŒ
ä»»æã®å Žæã«ãã£ã¬ã¯ããªãäœæãããã®äžã«Goã®ããã°ã©ã ãäœæããŸããã奜ããªãšãã£ã¿ã§ã次ã®å
容ã§main.go
ãã¡ã€ã«ãäœæããŸãã
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}
äœæã§ãããã端æ«äžã§äœæãããã£ã¬ã¯ããªãžç§»åããæ¬¡ã®ã³ãã³ããå®è¡ããŸãã
$ go run main.go
Hello, world!
ãšè¡šç€ºããããæåã§ãïŒ
次ã«ãGoã®ããã°ã©ã ããã«ã(ã³ã³ãã€ã«ããšèšã£ãŠãè¯ãã§ã)ããŠã¿ãŸãã
$ go build main.go
åããã£ã¬ã¯ããªã«main
ãšããå®è¡ãã¡ã€ã«ãäœæãããŸããããã¯ãæå
ã®PCã®OSãCPUã¢ãŒããã¯ãã£ã«ããéã圢åŒã®ãã¡ã€ã«ãçæãããŸãã
å®è¡ãã¡ã€ã«ãã§ããŸãããããå®è¡ããŠã¿ãŸãããã
$ ./main
å
ã»ã©ãšåãããã«ãHello, world!
ãšè¡šç€ºãããã§ãããããGoã®ããã°ã©ã ã¯ãã®ããã«ããã«ãããŠå®è¡åœ¢åŒã®ãã¡ã€ã«ãåºåããŠãé
ä»ããããšãã§ããŸããå®ã¯å
ã»ã©ã®go run
ãå
éšã§ã¯äžæãã£ã¬ã¯ããª(Linux, macã§ã¯/tmp
)ã«ãã«ãçµæãé
眮ããŠããããå®è¡ããŠããŸãã
ãŸãã詳现ãªèª¬æã¯çããŸãããç°å¢å€æ°ãèšå®ããããšã§ãéãOSãã¢ãŒããã¯ãã£ã®(äŸãã°ãmacOSäžã§Linuxã®)å®è¡ãã¡ã€ã«ããã«ãããããšãã§ããŸãããã®ãããmacOSã§éçºããã³ãã³ãã©ã€ã³ããŒã«ããWindowsãŠãŒã¶ãLinuxãŠãŒã¶åãã«ãã«ãããŠé ä»ããããšãå¯èœã§ããããããGoèšèªã人æ°ãªçç±ã®äžã€ã§ãã
ããŠãäœæããããã°ã©ã ãèŠãªãããGoèšèªã®ããã°ã©ã ã«ã€ããŠèª¬æããŠãããŸãããã
Goèšèªã®ããã°ã©ã ã¯ãããã±ãŒãžããšããåäœã§éçºãããŸããããã±ãŒãžã¯è€æ°(ãã¡ãããäžã€ã®å ŽåããããŸã)ã® .go ãã¡ã€ã«ãå«ãäžã€ã®ãã£ã¬ã¯ããªã§ãä»ã®ããã±ãŒãžããèªã¿èŸŒãããšãã§ããŸããäžè¡ç®ã«æžãã package main
ã¯ããã®ãä»ã®ããã±ãŒãžããèªã¿èŸŒãŸããéã®ããã©ã«ãã®ååãæå®ããŠããŸãããã®å Žåã¯ãmain
ããã±ãŒãžã§ããããšãæå®ããŠããŸãã
å®ã¯main
ããã±ãŒãžã¯ã¡ãã£ãšç¹æ®ãªããã±ãŒãžã§ãããã®ããã±ãŒãžã¯å®è¡ããããã®ããã±ãŒãžã§ããããšããããšã瀺ããŸããgo run
ãgo build
ã§ãã«ããããã®ã¯main
ããã±ãŒãžãšæ±ºãŸã£ãŠããŸããéã«ãä»ã®ããã±ãŒãžããèªã¿èŸŒãŸããããã®ããã±ãŒãžã¯main
ãšããååã«ããŠã¯ãããŸããã
ä»ã®ããã±ãŒãžãèªã¿èŸŒãéã¯import
ã«"
(ããã«ã¯ã©ãŒã)ã§æ¬ã£ãããã±ãŒãžåãèšè¿°ããŸããæšæºããã±ãŒãžã®å Žåã¯ãã®ãŸãŸããã±ãŒãžåãèšè¿°ããŸã(äŸ: "fmt"
)ãGitHubäžã«ããããã±ãŒãžã䜿çšãããå Žåã¯ãgithub.comããå§ãŸããã¹ãèšè¿°ããŸã(äŸ: "github.com/nasa9084/go-totp"
)ãæšæºããã±ãŒãžã®äžèЧãšè©³çްãªããã¥ã¡ã³ãã¯golang.org/pkgã§èŠãããšãã§ããŸãã
ããã±ãŒãžåã¯æåããå§ãŸããæåãšæ°åã_
(ã¢ã³ããŒããŒ)ã䜿ã£ãŠèªç±ã«ååãä»ããããšãã§ããŸã(誰ããããŸããããæ¥æ¬èªã§ååãä»ããããšãã§ããŸã)ãããŸãé·ããªãååã§ã_
ãæ°åã䜿ã£ãŠããªãååãå€ãã§ãã
äžã€ã®ãã£ã¬ã¯ããªã«ã¯äžã€ã®ããã±ãŒãž(ã¡ãã£ãšäŸå€ããããŸãã)ããå
¥ããããšã¯ã§ããŸããããã£ã¬ã¯ããªå
ã®.goãã¡ã€ã«ã¯ãã¹ãŠåãããã±ãŒãžåãæã€ããã«ããŠãã ããã
package
宣èšãšimport
宣èšãçµããããæ¬äœã®ããã°ã©ã ãæžããŸããä»åã¯main
颿°ãæžããŸããã
main
ããã±ãŒãžãå®è¡ããéã«äžçªæåã«å®è¡ãããã®ãmain()
颿°ã§ãã颿°ã®å®çŸ©ã®ä»æ¹ãªã©ã¯åŸè¿°ããŸãããfunc main()
ãå§ãã«åŒã°ããŸããCèšèªãªã©ã§ã¯åŒæ°ã«ã³ãã³ãã©ã€ã³åŒæ°ãåãåã£ããããŸãããGoèšèªã®ããã°ã©ã ã§ã¯åãåããŸãããè¿å€ããªãããã ã®func main()
ã§ããèŠããããã§ããã
ã³ãã³ãã©ã€ã³ããŒã«ãªã©ã®å®è¡å¯èœãªããã°ã©ã ãæžããšãã¯ãŸããmain
颿°ããæžãå§ãããšããããšãèŠããŠãããŠãã ããããã®ããšãããã€ãã®ãµã³ãã«ããã°ã©ã ãäŸç€ºããŸãããç¹ã«é¢æ°å®çŸ©ã説æã®ãªãå Žåã¯main
颿°ã®äžã§å®è¡ãããšåäœã確ãããããšãã§ããŸãã
Goèšèªã®åŠç¿ãå§ããåã«ãThe Go Playgroundã玹ä»ããŠãããŸããããThe Go Playgroundã¯webäžã§Goèšèªã®ããã°ã©ã ãå®è¡ã§ããç°å¢ã§ãããŠã§ããã©ãŠã¶ã§éããé»è²ãèæ¯ã®ãšãã£ã¿éšåã«ã³ãŒããå ¥åãç»é¢äžéšã®Runãã¿ã³ãæŒãããšã§å®è¡ããããšãã§ããŸããæšæºåºåã¯ç»é¢äžéšã«åºåãããŸãã
åŠç¿ã®éãã¡ãã£ãšããæåã確ãããããã«éåžžã«äŸ¿å©ã§ãããURLã§ã³ãŒãã®å ±æãã§ããŸããããæ¯éç©æ¥µçã«äœ¿ã£ãŠã¿ãŠãã ããã
Goèšèªã®èšèªä»æ§ã¯éåžžã«ã·ã³ãã«ã§ã1ããŒãžã«ãŸãšãŸã£ãŠããŸããæ¬ããã¹ããèšèªä»æ§ãšæšæºããã±ãŒãžããã¥ã¡ã³ããåèã«äœæãããŠããŸãã
Goèšèšã®ããã°ã©ã äžã«äœããã®ã³ã¡ã³ã(äŸãã°ããã¥ã¡ã³ãã ã£ãããå°æ¥çã«å®è£ ããªããã°ãªããªãããšããTODOã§ãã£ãã)ãæžã蟌ãã«ã¯ã次ã®ããã«æžããŸãã
// è¡ã³ã¡ã³ããè¡æ«ãŸã§ãã³ã¡ã³ã
/* ã³ã¡ã³ã */
CèšèªãJavaãšãã£ãèšèªãšåæ§ãGoèšèªã§ã¯åŠçã®ã²ãšãŸãšãŸãã衚ãçµç«¯èšå·ãšã㊠ã»ãã³ãã³;
ã䜿çšããŸãããã»ãšãã©ã®å Žåçç¥å¯èœã§ãã
çç¥ããéã¯ããã«ãæã«ã»ãã³ãã³ãèªåæ¿å
¥ãããŸã(æ¿å
¥ã«ãŒã«ã¯å
¬åŒããã¥ã¡ã³ã: ã»ãã³ãã³ãåç
§ããŠãã ãã)ã
Goèšèªã§ã¯å€ãæ ŒçŽããŠãã(ãããã¯å€ã«ä»ããã©ãã«)ãšããŠã宿°ãšå€æ°ã®äºçš®é¡ãçšæãããŠããŸãã宿°ã¯å€ã倿Žã§ããã倿°ã¯å€æŽã§ããŸããä»ã®èšèªã§ã¯å®æ°ãå®çŸ©ããéã«ã¯ãã¹ãŠå€§æåã§åœåããããšãšãããŠããå Žåãå€ãã§ãããGoèšèªã§ã¯å€æ°ã宿°ãåãããã«åœåããŸãã
宿°ã宣èšãããšãã«ã¯const
æã䜿çšããŸããããã¯é¢æ°ã®å€ã§ãã颿°ã®äžã§ã宣èšããããšãã§ããŸãã
const Foo = 100
倿°ãå®çŸ©ããæ¹æ³ã¯äºã€ãããŸããäžã€ç®ã¯var
æã䜿çšããæ¹æ³ã§ã(ã»ãšãã©)ã©ãã§ã䜿çšããããšãã§ããŸãã
var Bar int = 0
var Baz = 100 // å宣èšãçç¥ããããšãã§ãã
var Baz int // 倿°åã ãã宣èšããããšãã§ãã
ã³ã¡ã³ãã«èšèŒããããã«ãåã®å®£èšãçç¥ããããšãã§ããŸãããã®å Žåã倿°ãåãæããªãããã§ã¯ãªããå³èŸºããåæ å ±ãæšæž¬ãããŸãã ãŸããäžè¡ç®ã®ããã«å€æ°åã®å®£èšã ããè¡ããåæååŠçãçç¥ããå Žåã«ã¯å€ãšããŠããããã®åã®åæå€ãèšå®ãããŸã(äŸãã°ãintåã§ããã°0ãstringåã§ããã°ç©ºæåå)ã ãã®ãããæ¬¡ã®äžã€ã®å€æ°å®£èšã¯åãæå³ãæã¡ãŸãã
var X int = 0
var X = 0
var X int
ããäžã€ã¯:=
ã䜿ã£ãæ¹æ³ã§ã颿°å
ã§ã®ã¿äœ¿çšããããšãã§ããŸããplay
// https://play.golang.org/p/Fen0IU5gfQ0
func main() {
foo := 100
fmt.Println(foo * 2)
// Output:
// 200
}
颿°å ã§å®çŸ©ãã倿°ã䜿çšãããŠããªãå Žåãã³ã³ãã€ã«æã«ãšã©ãŒãšãªããŸãã®ã§æ³šæããŸãããã
const
ãvar
ã¯æ¬åŒ§ã䜿çšããŠãŸãšããããšãã§ããŸãã
const (
MinFoo = 0
MaxFoo = 100
)
倿°ã宿°ããããã¯é¢æ°ãªã©ãGoèšèªã§åœåãè¡ããšãã«ã¯ãå é ã®æåãéåžžã«å€§ããªæå³ãæã¡ãŸããGoèšèªã§ã¯packageãšããåäœã§è€æ°ã®ãœãŒã¹ã³ãŒããã¡ã€ã«ãã²ãšãŸãšãã«ããŸãããå°æåããå§ãŸã倿°ãªã©ã¯packageå ã§ããåç §ã§ããŸãããpackageã®å€ããåç §ãããå Žåã¯ååã倧æåã§å§ããå¿ èŠããããŸãã
iota
ã¯å®æ°ãå®çŸ©ãããšãã«äœ¿çšã§ããç¹æ®ãªå€ã§ãé£ç¶ããæŽæ°å€ãšããŠåãæ±ãããšãã§ããŸãã説æãå°ã
é£ããã®ã§ãäŸãèŠãŠã¿ãŸããããplay
// https://play.golang.org/p/EBRDD9qLYlu
const (
A = iota // A = 0
B = iota // B = 1
C = iota // C = 2
D = iota // D = 3
)
æ¬åŒ§ã§ããã£ãconst
ã°ã«ãŒãã®äžã§ããã°ãäºåºŠç®ä»¥éã®iota
ãçç¥ããããšãã§ããŸããplay
// https://play.golang.org/p/1YavGGarLpu
const (
A = iota // A = 0
B // B = 1
C // C = 2
D // D = 3
)
iotaã«å¯ŸããŠäœãã®æŒç®ãè¡ã£ãå Žåãäºã€ç®ä»¥éãçç¥ãããå Žåã§ããæåã«æå®ããæŒç®ãšåããã®ãšããŠæ±ãããŸããplay
// https://play.golang.org/p/z9I1o5TjvBL
const (
Flg1 = 1 << iota // 1
Flg2 // 2
Flg3 // 4
)
ãã®ãbit shiftãšiota
ãçšãã宿°å®çŸ©ã¯è€æ°éžæå¯èœãªãã©ã°ã®ç®¡çãªã©ã«äŸ¿å©ã§ãã
iota
ã¯const
ãæžãããšã«0ã«ãªã»ãããããŸããplay
// https://play.golang.org/p/svXJ0UEqZkA
const A = iota // A = 0
const B = iota // B = 0
const (
Foo = iota // Foo = 0
Bar // Bar = 1
)
const (
Hoge = iota // Hoge = 0
Fuga // Fuga = 1
)
Goèšèªã§ã¯å€æ°ã宣èšããŠããã®ã«äœ¿çšããŠããªããšããå Žåãã³ã³ãã€ã«ãšã©ãŒãšãªããŸãããããäžæ¹ã§ãå€ãå¿
èŠãªãå Žå(äŸãã°ãè€æ°ã®è¿å€ã®å
äžéšã ããå¿
èŠãªå Žåãªã©)ããããŸãããããã£ãå Žåã«äœ¿çšã§ããããå€ãæšãŠãããã®å€æ°ãããã©ã³ã¯æå®åã§ãããã©ã³ã¯æå®åã¯_
(ã¢ã³ããŒããŒ)1æåã®å€æ°ã§ãã©ãã§ã䜿çšããããšãã§ããŸãã
ãªãã©ã«ãšã¯ããœãŒã¹ã³ãŒãäžã§ãæ°å€ãæååãçŽæ¥ã«èšè¿°ãã宿°ã®ããšã§ããäŸãã°ããããŸã§æŽæ°ãçŽæ¥èšè¿°ããäŸãããã€ãåºãŠããŸããããããã¯æŽæ°ãªãã©ã«ã§ããæŽæ°ãªãã©ã«ãæµ®åå°æ°ç¹æ°ãªãã©ã«ã¯ãã®ãŸãŸæ°å€ãèšè¿°ããããšãã§ããŸãã
æååãèšè¿°ããããã®ãªãã©ã«ãæååãªãã©ã«ã§ãäºã€ã®æžãæ¹ããããŸããäžã€ç®ã¯ "..."(ããã«ã¯ã©ãŒã)ã䜿çšããæžãæ¹ã§ãæ¹è¡çãå«ãããšãã§ããŸãããã"\n"(æ¹è¡)ã"\t"(TAB)ãªã©ã®ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ã䜿çšããããšãã§ããŸããäºã€ç®ã¯ ...
(ããã¯ã¯ã©ãŒã)ã䜿çšããæžãæ¹ã§ãæ¹è¡ãå«ãããšãã§ããŸããããšã¹ã±ãŒãã·ãŒã±ã³ã¹ã¯è§£éãããŸãããplay
æåã衚çŸãããªãã©ã«ãšããŠRuneãªãã©ã«ãçšæãããŠããã '.'(ã·ã³ã°ã«ã¯ã©ãŒã)ã䜿çšããŸãã
// https://play.golang.org/p/9Ef3XKhQKOU
dq := "Hello\nWorld"
fmt.Println(dq)
bq := `Hello\nWorld`
fmt.Println(bq)
// Output:
// Hello
// World
// Hello\nWorld
çåœå€ãªãã©ã«ã¯äºã€ã®å€ããããtrue
ãšfalse
(ãããããã¹ãŠå°æå)ããã®ãŸãŸæžãããšãã§ããŸãã
foo := true
bar := false
Goèšèªç¬ç¹ã®ãªãã©ã«ãšããŠãè€åãªãã©ã«ããããŸããè€åãªãã©ã«ã¯åŸè¿°ããé åãSliceãmapãæ§é äœãåæåããããã®ãªãã©ã«ã§ããååã®åŸã« {}(äžæ¬åŒ§)ãä»ããããã¡ã§èšè¿°ããŸããäžæ¬åŒ§ã®äžã«ã¯å€ãåæããããindex:valueã®åœ¢ã§å€ãèšè¿°ããŸããplay
// https://play.golang.org/p/HF35Tl0RTJc
// æååã®Sliceã®åæå
ss := []string{"foo", "bar", "baz"}
// ããŒãæååãå€ãæååã®mapã®åæå
mp := map[string]string{
"foo": "hoge",
"baz": "fuga", // æ¹è¡ããå Žåã¯æåŸã®èŠçŽ ã§ãè¡æ«ã«ã«ã³ããå¿
èŠ
}
// ããã€ãã®ã¡ã³ããŒãæã€æ§é äœFooã®åæå
foo := Foo{
Hoge: "hogehoge",
Fuga: true,
}
Goèšèªã®å€æ°ã¯å¿ ãåãæã£ãŠããŸãã倿°ã®åã«ãã£ãŠæ ŒçŽã§ããå€ãéããŸãããçšéãéããŸãã
çåœå€å(bool
)ã¯ãç(true
)ãšåœ(false
)ã®ãããããå€ãšããŠæã€äºå€ã®åã§ããäž»ãšããŠæ¡ä»¶åå²ã«çšããããŸãã
æ°å€åã¯ãã®åã®éããæ°å€ãæ ŒçŽãã倿°åã§ã倧ããåããŠäžã€ãããŸããäžã€ã¯æŽæ°(Integer)ã§ã笊å·ä»ãã®ãã®ãšç¬Šå·ãªãã®ãã®ããããŸããéåžžã¯int
åããã䜿ãããå®è¡ç³»ã«ãããŸããã-2147483648ã2147483647ãŸãã¯-9223372036854775808ã9223372036854775807ã®ç¯å²ã§æŽæ°ã衚çŸããããšãã§ããŸããå®è¡ç³»ã«ããã64bitã®å€ã䜿çšãããå Žåã¯int64
ã䜿çšããŸããããã§ã¯èª¬æãçããŸããã笊å·ãªãã®ãã®ã¯æ£ã®å€ã«ç¯å²ãçµãããšã§çŽäºåã®ç¯å²ã衚çŸããããšãã§ããŸããint8
(8bit)ããint64
(64bit)ãšãã£ãããµã€ãºãæå®ããåã䜿çšããããšãå¯èœã§ãã
ããäžã€ã¯æµ®åå°æ°ç¹æ°åã§ããã®åã®éãå°æ°ç¹ãå«ã宿°ã衚çŸããããšãã§ããåã§ããæµ®åå°æ°ç¹æ°åã¯32bit(float32
)ã®ãã®ãš64bit(float64
)ã®ãã®ããããfloat64
ã®æ¹ããã䜿çšãããŠããããã§ãã
æåŸã¯è€çŽ æ°åã§ã䜿çšãããããšã¯å€ããªããšæããŸãã®ã§ãããã§ã¯èª¬æãçããŸãã
ãŸããuint8
(8bit笊å·ãªãæŽæ°)ã®å¥åãšããŠbyte
ããint32
(32ããã笊å·ããæŽæ°)ã®å¥åãšããŠrune
ãçšæãããŠããŸããbyte
ã¯ååãããããããã«byteå€ããrune
ã¯ã¡ãã£ãšãããã«ããã®ã§ãããUnicodeã®ã³ãŒããã€ã³ãã衚çŸããããã®å€ã§ãã
æåååã¯æååãæ ŒçŽããåã§ããèšèªã«ããå®è£ ã倧ããéãããšãããã®ãæååã®åã§ãããGoèšèªã§ã¯æåååã¯ãUTF-8ãªã©ã®æååãšã³ã³ãŒãã¯èæ ®ããåãªãbyteã®é åãšããŠè¡šçŸãããŸã(Goèšèªã®ãœãŒã¹ã³ãŒãèªäœã¯UTF-8ã§æžãããšã«ãªã£ãŠããŸãã®ã§ãããã°ã©ã äžã§ãªãã©ã«ã®åœ¢ã§å®£èšããæååã¯UTF-8ã®byteåãæ ŒçŽãããããšã«ãªããŸã)ããã®ãããæ¥æ¬èªã®ããã«ãã«ããã€ãæåãæ±ãå Žåã«ã¯äžéšçŽæçã§ã¯ãªãæåã«ãªãå ŽåããããŸãã®ã§æ³šæãå¿ èŠã§ãã
æååã®é·ã(byteæ°)ãååŸããã«ã¯ãçµã¿èŸŒã¿é¢æ°ã§ããlen()
颿°ã䜿çšã§ããŸããplay
// https://play.golang.org/p/CwOQ6KZkjKM
s := "foobar"
fmt.Println(len(s))
// Output:
// 6
åè¿°ã®éããæååã¯åãªãbyteã®åã§ãlen()
颿°ã¯byteæ°ãè¿ããŸãã®ã§ãæ¥æ¬èªãå«ãŸããå Žåã¯ãæåã®æ°ãã§ã¯ãªãå€ãè¿ã£ãŠããŸãã®ã§æ³šæããŸããããplay
// https://play.golang.org/p/Di7sbMSlKDp
s := "ããã«ã¡ã¯"
fmt.Println(len(s))
// Output:
// 15
(Unicodeæååã®)æåæ°ãååŸãããå Žåããã£ããrune
ã®Sliceã«çŽããŠããé·ãããšããŸããplay
// https://play.golang.org/p/YtmDa4FGsrb
s := "ããã«ã¡ã¯"
fmt.Println(len([]rune(s)))
// Output:
// 5
Goèšèªã®æšæºããã±ãŒãžã«ã¯æååãåãæ±ããã®ãå€ããããŸãã代衚çãªã¢ããšããŠæ¬¡ã®æ§ãªãã®ããããŸãã
bytes
/strings
- æååã®åå²ãçµåãªã©ãæšæºçãªæåååŠçãã²ãšãŸãšãã«ããããã±ãŒãžã§ãã
bytes
ãšstrings
ã¯ãããã[]byte
åãšstring
åã察象ãšããŠãããããããåã颿°ãçšæãããŠããŸãã
- æååã®åå²ãçµåãªã©ãæšæºçãªæåååŠçãã²ãšãŸãšãã«ããããã±ãŒãžã§ãã
strconv
- æååãšä»ã®å(æ°å€ãçåœå€)ãšã倿ããããã®é¢æ°ããŸãšããããã±ãŒãžã§ãã
unicode
- Unicodeã®ã³ãŒããã€ã³ããåãæ±ãããã®ããã±ãŒãžã§ããç¹ã«ãã®æåãã©ããã£ãæåã§ããããå€å¥ãã
IsXXX
ãšãã圢ã®é¢æ°ãå å®ããŠããŸãã
- Unicodeã®ã³ãŒããã€ã³ããåãæ±ãããã®ããã±ãŒãžã§ããç¹ã«ãã®æåãã©ããã£ãæåã§ããããå€å¥ãã
regexp
- æ£èŠè¡šçŸãåãæ±ãããã®ããã±ãŒãžã§ãã
é åã¯ããç¹å®ã®å(ãã®åã¯äœã§ãããã§ã)ã®ãªã¹ããä¿æããåã§ããé åã«æ ŒçŽãããå€ããããã®ããšãèŠçŽ ãšåŒã³ãŸããæåã«èŠçŽ ã®æ°(é·ããšããããŸã)ãæå®ããŠå®£èšããŸãã
var arrStr [2]string // æååãäºåæ ŒçŽã§ããé
å
var arrInt [10]int // æŽæ°ãååæ ŒçŽã§ããé
å
é åã¯èŠçŽ çªå·(ããããæ·»ãåããšåŒã³ãŸã)ã䜿çšããããšã§èŠçŽ ã«ã¢ã¯ã»ã¹ã§ããŸããæ·»ãåã¯æåã®èŠçŽ ã0ã§ããã®åŸ1, 2, 3...ãšç¶ããŸããplay
// https://play.golang.org/p/Fy5THz9O49F
arr := [5]string{"foo", "bar", "baz", "qux", "quux"}
fmt.Println(arr[3])
// Output:
// qux
:
(ã³ãã³)ã䜿ã£ãŠç¯å²ã衚çŸããããšãã§ããŸãããã®æåŸãããã®ãSliceã§ããSliceã¯é
åã®äžéšã衚çŸããåã§ããå¯å€é·ã®é
åãšããŠæ±ãããããšãå€ããé
åããç®ã«ããæ©äŒãå€ãã§ãããã[éå§çªå·:çµäºçªå·]
ãšããæãéå§çªå·ã§åŸãããèŠçŽ ã¯å«ãŸããŸãããçµäºçªå·ã§åŸãããèŠçŽ ã¯å«ãŸããªãããšã«æ³šæãå¿
èŠã§ããplay
// https://play.golang.org/p/ggIKj3ryRhp
arr := [5]string{"foo", "bar", "baz", "qux", "quux"}
fmt.Println(arr[2:4])
// Output:
// [baz qux]
é åã®å®£èšãšåæ§ã«ãèŠçŽ æ°ãçç¥ãããšSliceã宣èšããããšãã§ããŸãã
var sliceStr []string
var sliceInt []int
é
åã¯é·ãã倿Žã§ããªããããèŠçŽ ã®è¿œå ãããããšã¯ã§ããªãã®ã§ãããSliceã§ã¯ã§ããŸãããã®éã«ã¯ãçµã¿èŸŒã¿é¢æ°ã§ããappend()
ã䜿çšããŸããappend()
ã¯ç¬¬äžåŒæ°ã«ä»»æã®Sliceã第äºåŒæ°ã«è¿œå ãããèŠçŽ ãåããSliceã«èŠçŽ ã远å ããæ°ããSliceãè¿ããŸããå
ã®Slice(第äžåŒæ°ã«äžãããããã®)ã¯å€æŽãããŸãããå
ã®é
åã«è¿œå ãããå Žåã«ã¯æ¬¡ã®æ§ã«ããŸããplay
// https://play.golang.org/p/hocpa8Y4YiU
ss := []string{"foo", "bar"}
ss = append(ss, "baz")
é
åãSliceã«ã¯ã容é(Capacity)ãšé·ããšãããäºã€ã®ãé·ãããååšããŸãã
詳现ãªèª¬æã¯çããŸããã容éã¯cap()
颿°ã§ãé·ãã¯len()
颿°ã§ååŸããããšãã§ããŸãã
é
åã®å Žåã¯å®¹éãšé·ãã¯åãå€ã§ãã
Mapã¯é
åã®ããã«ããã€ãã®å€ããŸãšããåã§ããé
åãšã¯éãç¹ãšããŠãæ·»ãåã«ä»»æã®åã䜿çšã§ããç¹ãé åºãæããªãç¹ãäžããããŸããä»ã®èšèªã§ã¯ã飿³é
åããHashMapããèŸæž(dict)ããªã©ãšåŒã°ããŠãããã®ãšåæ§ã®ãã®ã§ããå®£èšæã«ã¯æ·»ãåã«äœ¿ãå€(ããŒ)ãšãããŒã«å¯Ÿå¿ããå€ã:
(ã³ãã³)ã§åºåããªãã宣èšããŸããplay
// https://play.golang.org/p/GmG84oktVZU
age := map[string]int{
"Alice": 20,
"Bob": 18,
"Charlie": 22,
}
fmt.Println(age["Charlie"])
// Output:
// 22
ååšããªãããŒãæå®ããå Žåã¯ãŒãå€ãè¿ããŸããåã«å€ãåŸãå Žåã¯ç¬¬äžè¿å€ã®ã¿ã§äœ¿çšã§ããŸããã第äºè¿å€ãåãåãããšãã§ããŸãã第äºè¿å€ãšããŠèŠæ±ããããŒãååšãããã©ãããè¿ãããŸããplay
// https://play.golang.org/p/pGjlQu5ms0B
age := map[string]int{
"Alice": 20,
}
_, ok1 := age["Alice"] // ok1 == true
_, ok2 := age["Bob"] // ok2 == false
èŠçŽ ã®è¿œå ã¯ä»£å ¥ã§è¡ããŸããplay
// https://play.golang.org/p/CnHUgJROIYI
age := map[string]int{}
age["Dave"] = 30
fmt.Println(age["Dave"])
// Output:
// 30
èŠçŽ ã®åé€ã¯çµã¿èŸŒã¿é¢æ°ã§ããdelete()
ã䜿çšããŸãã第äžåŒæ°ã«Mapèªäœãã第äºåŒæ°ã«åé€ãããããŒãäžããŸããplay
// https://play.golang.org/p/PAFfyIuq4v8
age := map[string]int{
"Alice": 20,
"Bob": 18,
}
a1, ok1 := age["Alice"] // ok1 == true
fmt.Println(a1)
delete(age, "Alice")
a2, ok2 := age["Alice"] // ok2 == false
fmt.Println(a2)
// Output:
// 20
// 0
ãããŸã§ã«ãããã€ãã®çµã¿èŸŒã¿é¢æ°ã玹ä»ããŸããããããåŠçãã²ãšãŸãšãã«ãããã®ãã颿°ããšåŒã³ãŸãã颿°ã¯èªåã§å®çŸ©ããããšãã§ããæ¬¡ã®ããã«å®çŸ©ããŸãã
func 颿°å(åŒæ°) è¿å€ã®å {
åŠçå
容
}
颿°åã¯å€æ°åãšåæ§ã倧æåã§å§ãŸãå Žåã¯ããã±ãŒãžå€ã«å
¬éãããŸããåŒæ°ã¯å€æ°å®çŸ©ãšåæ§ã«ã倿°å å
ã®ã»ãããã«ã³ãåºåãã§æå®ããŸãã
Goèšèªã§ã¯é¢æ°ã¯è¿å€ãè€æ°è¿ãããšãã§ããŸããäžã€ããè¿ããªãå Žåã¯æ¬åŒ§ã§ãããããåããã®ãŸãŸèšè¿°ããŸãã
åŠçäžã§è¿å€ãè¿ããšã㯠return
æã䜿çšããŸãã
äŸãšããŠãè¶³ãç®ãè¡ã颿°ãèŠãŠã¿ãŸããããplay
// https://play.golang.org/p/Ux5wsnjGucT
func Add(a int, b int) int {
return a + b
}
ãã®é¢æ°ã¯intåã®åŒæ°ãäºã€åããintåã®å€ãäžã€è¿ããŸãããã®ããã«ãåãåã®åŒæ°ãé£ç¶ããå Žåãå宣èšããŸãšããããšãã§ããŸãã æ¬¡ã®é¢æ°ã¯å ã»ã©ã®ãã®ãšå šãç䟡ã§ããplay
// https://play.golang.org/p/07rmFc6BS7j
func Add(a, b int) int {
return a + b
}
è¿å€ãè€æ°è¿ãå Žåã¯ãè¿å€ãæ¬åŒ§ã§ããããã«ã³ãåºåãã§èšè¿°ããŸãããã®ãšãããšã©ãŒãè¿ãããæã«ã¯ããšã©ãŒã æåŸã®è¿å€ã«ãã ã®ãæ £äŸã§ãã (ãšã©ãŒã§ã¯ãªãå Žåã¯å¥œããªé çªã§è¯ã)play
// https://play.golang.org/p/OcTk6d5WQZ3
func AddString(a, b string) (int, error) {
// strconv.Atoi()ã¯æååãintã«å€æãã颿°ã
// äžããããæååãæ°å€ã§ã¯ãªãå Žåããšã©ãŒãè¿ããããã§ãªããã°ç¬¬äºè¿å€ã¯nilãè¿ãã
ai, err := strconv.Atoi(a)
if err != nil { // åŸè¿°ã®ifæã§ãšã©ãŒãã§ãã¯ããã
return 0, err
}
bi, err := strconv.Atoi(b)
if err != nil {
return 0, err
}
return ai + bi, nil
}
æ§é äœ(Struct)ã¯ãè€æ°ã®ããŒã¿ããŸãšããŠäžã€ã®å¡ã«ãããã®ã§ããããããã®ããŒã¿ã¯ãã£ãŒã«ããšåŒã°ããååãšåãæã¡ãŸãã äŸãã°ãäžäººã®äººé(ããã§ã¯ååãšå¹Žéœ¢ããã£ãŒã«ããšããŠæã£ãŠããããšãšããŸã)ã衚çŸããæ§é äœã¯æ¬¡ã®ããã«å®çŸ©ããŸãã
type Person struct {
Name string
Age int
}
æ§é äœã¯è€åãªãã©ã«ã䜿ã£ãŠåæåããããšãã§ããŸãããŸããããããã®ãã£ãŒã«ããžã¯.
(ããã)ã䜿ã£ãŠã¢ã¯ã»ã¹ããããšãã§ããŸããplay
// https://play.golang.org/p/fUVDYNC3nP7
alice := Person{
Name: "Alice",
Age: 20,
}
fmt.Println(alice.Age)
// Output:
// 20
ãã£ãŒã«ãã®ååãå°æåã§å§ããå Žåã¯ãæ®éã®å€æ°çãšåæ§ã«ãããã±ãŒãžã®å€ããã¯çŽæ¥ã¢ã¯ã»ã¹ã§ããªããªããŸãã
ãã£ãŒã«ãã«å ããŠãæ§é äœã¯ã¡ãœãããšåŒã°ãã颿°ãæã€ããšãã§ããŸããã¡ãœããã¯ãã£ãŒã«ããšåæ§ã.
(ããã)ã䜿ã£ãŠåŒã³åºãããšãã§ããŸãã
ã¡ãœããã®å®çŸ©ã¯ã颿°å®çŸ©ãšã»ãšãã©åãã§ã颿°åã®åã«ã¬ã·ãŒããŒãšåŒã°ãããæ§é äœã®åãåãæ
å ±ãèšè¿°ããŸããplay
// https://play.golang.org/p/J-EzWvR9bXh
func (p Person) IsYoung() bool {
return p.Age < 30
}
alice := Person{
Name: "Alice",
Age: 20,
}
fmt.Print(alice.IsYoung())
// Output:
// true
ã¬ã·ãŒããŒãšããŠã¯ãæ§é äœã®å€ã§ã¯ãªãããã€ã³ã¿ãæå®ããããšãã§ããŸãããã€ã³ã¿ãæå®ããæã«éããã¡ãœããå ã§ã¬ã·ãŒããŒã®ç¶æ ãå€åãããããšãã§ããŸããplay
// https://play.golang.org/p/CB5K2-qdSpW
type Car struct {
IsRunning bool
}
func (car Car) RunWithValue() {
car.IsRunning = true // ã¡ãœããå€ã§ã¯åœ±é¿ããªã
}
func (car *Car) RunWithPointer() {
car.IsRunning = true // å
ã®å€ãæžãæãã
}
myCar := Car{} // å€ãäžããªããšåæå€(IsRunning = false)ãšãªã
myCar.RunWithValue()
fmt.Println(myCar.IsRunning)
myCar.RunWithPointer()
fmt.Println(myCar.IsRunning)
// Output:
// false
// true
ãã€ã³ã¿ã¯ããããŒã¿(ãã¹ãŠã®åã察象ã§ã)ã®å®äœ(ã¡ã¢ãªäžã§ã®ã¢ãã¬ã¹)ãæãåã§ãããæååã®ãã€ã³ã¿ãããintã®ãã€ã³ã¿ããªã©ããxxxã®ãã€ã³ã¿ããšãã圢ã§åŒã³ãŸãã
ãã€ã³ã¿ããšãããããåãTãšãããšãTã®ãã€ã³ã¿ã¯*T
ãšæžããŸãã
var pi *int // intã®ãã€ã³ã¿
var si *string // stringã®ãã€ã³ã¿
type Person struct { /* ... */ }
var pp *Person // Personã®ãã€ã³ã¿
ãŸãããã倿°ãããå€ã®ãã€ã³ã¿ãååŸããããã«ã¯ã&
æŒç®åã䜿çšããŸããplay
// https://play.golang.org/p/2DW-pYgMF_Y
i := 10
fmt.Println(&i) // iã®ãã€ã³ã¿(ã¢ãã¬ã¹)ã衚瀺
éã«ããã€ã³ã¿ããå€ãåŸããå Žåã¯*
æŒç®åã䜿çšããŸããplay
// https://play.golang.org/p/Cn47DrOwLfy
var sp *string
s := "hello"
sp = &s
fmt.Println(*sp)
// Output:
// hello
ãã€ã³ã¿åãå®çŸ©ãããšãã*
ã䜿çšãããã€ã³ã¿ããå€ããšããšãã*
ã䜿çšããã®ã§ãæ··ä¹±ããã¡ãªã®ã§é 匵ããŸãããã
interfaceã¯ã¡ãœããã®çµãå®çŸ©ããåã§ããJavaã®æ§ã«æ§é äœã®å®çŸ©æã«å®è£
ããinterfaceãèšè¿°ããå¿
èŠã¯ãªããinterfaceã§å®çŸ©ãããã¡ãœãããå
è¶³ããŠããæ§é äœã¯ãã®interfaceãå®è£
ããŠãããšããŠåãæ±ãããšãã§ããŸããäŸãã°ãio.Reader
interfaceã¯æ¬¡ã®æ§ã«å®çŸ©ãããŠããŸãã
type Reader interface {
Read([]byte) (int, error)
}
*bytes.Buffer
æ§é äœã*os.File
æ§é äœã¯ãããæºãããŠãããããio.Reader
ãèŠæ±ãã颿°ãªã©ã«å¯ŸããŠ*bytes.Buffer
ã*os.File
ã䜿çšããããšãã§ããŸãããŸããèªåã§ãããæºããæ§ãªæ§é äœãå®è£
ããããšãã§ããŸããio.Writer
ãç°¡åã«å®è£
ããŠã¿ãŸããããplay
// https://play.golang.org/p/Yvf0E8T2Lz1
// io.Writerã¯æ¬¡ã®æ§ã«å®çŸ©ãããŠãã
// type Writer interface {
// Write([]byte) (int, error)
// }
type myWriter struct {} // ç¹ã«io.Writerãå®è£
ããŠããããšãæç€ºããŠããããã§ã¯ãªã
func (w myWriter) Write(b []byte) (int, error) {
fmt.Println(string(b))
return len(b), nil
}
func needWriter(w io.Writer) {
w.Write([]byte("Hello"))
}
mw := myWriter{}
needWriter(mw)
// Output:
// Hello
Goèšèªã®å€§ããªç¹åŸŽãšããŠäžŠè¡åŠçãç°¡åã«å®è£
ã§ããããšãæããããŸããGoèšèªã§ã¯[goroutine]ãçšããããšã§äžŠè¡åŠçãå®è£
ããŸããChannelã¯äžŠè¡åŠçå®è£
ã®äžã§ãè€æ°ã®goroutineéã§ã®å€ã®éåä¿¡ãè¡ãããã®åã§ããCSãå匷ããæ¹ã«ã¯ããQueueã®æ§ãªã¢ãããšèª¬æããã°ããããããã§ãããããéåä¿¡ãããåãT
ãšãããšãChannelã®åã¯chan T
ãšè¡šçŸããŸããåæåãããŠããªãChannelã¯nilã§ããã®ãŸãŸã ãšäœ¿çšã§ããŸããã®ã§ãçµã¿èŸŒã¿é¢æ°make()
ã§ChannelãäœæããŸãã
ch := make(chan int)
Channelã¯ãéã(Send)ããšãåãåã(Receive)ãã®äºã€ã®æäœãããããšãã§ããŸãããããã®æäœã«ã¯<-
æŒç®åã䜿çšããŸããChannel倿°ã®å·ŠåŽã«<-
ãæžããå Žåã¯åãåããå³åŽã«æžãããšãã¯éä¿¡ã§ããplay
// https://play.golang.org/p/HHZD7xKjtnE
ch := make(chan int)
go func() {
ch <- 10
}()
fmt.Println(<-ch)
// Output:
// 10
éä¿¡åŽã¯å€ãåãåããããŸã§ãåä¿¡åŽã¯å€ãæ¥ããŸã§ããããã¯(åŸ æ©)ããŸãããã®ãããåãåãåŽãããªããåãgoroutineã§éä¿¡ãšåãåãã®äž¡æ¹ãè¡ãããšããŠããããªã©ã®å Žåãdeadlockããããšãããã®ã§æ³šæããŸããããplay
// https://play.golang.org/p/qeRi4FuenwC
ch := make(chan int)
ch <- 10
Channelã«ã¯ãããã¡ãçšæããããšãã§ããŸãããã»ãšãã©ã®çšéã§ã¯ãããã¡ã䜿çšããªãããšã®æ¹ãå€ãã§ãããã
éä¿¡åŽãããããã以äžå€ãéããŸãããããšããããšãäŒãããããChannelã¯ãéãããããšãã§ããŸãããã®éã«äœ¿çšããã®ãçµã¿èŸŒã¿é¢æ°ã§ããclose()
ã§ããåä¿¡åŽãChannelã«å¯ŸããŠfor-range(åŸè¿°)ã䜿çšããŠèªã¿èŸŒã¿ããŠããå Žåãªã©ã«ã¯ãChannelãã¡ããšéããããšã§é©åã«åŠçãç¶è¡ããããšãã§ããŸããplay
// https://play.golang.org/p/qjsB8MK9QrG
ch := make(chan int)
go func() {
ch <- 10
ch <- 20
ch <-30
close(ch)
}()
for v := range ch {
fmt.Println(v)
}
fmt.Println("finished")
äžæ¹ãéããåŸã®Channelã«å¯ŸããŠå€ãéä¿¡ããããšããããéããChannelãããã«éããããšãããšããã°ã©ã ãç°åžžçµäºããŸãã®ã§ã泚æãå¿ èŠã§ãããªããéããåŸã®Channelããèªã¿åºããããå Žåã¯ãããã¯ããã«ãŒãå€ãè¿ããŸããplay
// https://play.golang.org/p/0KS_K0yUmvh
ch := make(chan int)
close(ch)
fmt.Println(<-ch)
// Output:
// 0
äœããã®æ¡ä»¶ã«ãã£ãŠåŠçãå€ãããå Žåãifæã䜿çšããŸããæžãæ¹ã¯æ¬¡ã®éãã§ãã
if [åæåæ; ]æ¡ä»¶åŒ {
// åŠç
}
æ¡ä»¶åŒã¯çåœå€ãè¿ããããªãªã«ããæžããŸããäŸãã°ãçåœå€ãè¿ããããªé¢æ°åŒã³åºãã§ãããã§ããã a == b
ã®ãããªçå·ã»äžçå·ã䜿çšããæ¯èŒåŒã§ãããŸããŸããã
åæåæã¯ä»ã®èšèªã§ã¯ããŸãèŠãããªãèšæ³ã§ãããæ¡ä»¶å€å®ã®åã«äœãã®ååŠçãè¡ãããšãã§ããŸãã
äœããã®ãšã©ãŒãè¿ããããªé¢æ°åŒã³åºããåæåæã§è¡ãããã®ãšã©ãŒãã§ãã¯ãæ¡ä»¶åŒãšããŠèšè¿°ããããšããæ§ãªåœ¢ã§äœ¿çšããŸããFoo()
ãfunc() error
ãšãããšã
err := Foo()
if err != nil {
// error handling
}
ãã
if err := Foo(); err != nil {
// error handling
}
ã®ããã«æžãããšãã§ããéåžžã«èŠãç®ããã£ããããŸããæ¡ä»¶åŒãfalse
ã ã£ãå Žåã®åŠçãæžãããå Žåãelseç¯ãç¶ããããšãã§ããŸãã
if [åæåæ; ]æ¡ä»¶åŒ {
// åŠç
} else {
// åŠç
}
è€æ°ã®æ¡ä»¶åŒãã¹ãŠãæºããæã«åŠçããããå Žå(AND)ã«ã¯ãæŒç®å&&
ããããããã®æ¡ä»¶ãæºãããŠãããšãã«åŠçããããå Žå(OR)ã«ã¯ãæŒç®å||
ã䜿çšããŸããplay
// https://play.golang.org/p/_iJta1Dg4CM
if foo == 1 && bar == 2 {
// 倿°fooã1ã§å€æ°barã2ã®æã«å®è¡ããã
fmt.Println("foo is 1 and bar is 2")
}
if baz < 100 || 200 < baz {
// 倿°bazã100æªæºã200ãã倧ãããšãã«å®è¡ããã
fmt.Println("baz is under 100 or over 200")
}
ãŸããè€æ°ã®æ¡ä»¶åŒã§åå²ãããå Žåã«ã¯ãifãšelseã®éã«else ifç¯ã远å ããããšã§å®çŸã§ããŸãã
if [åæåæ; ]æ¡ä»¶åŒ {
// åŠç
} else if æ¡ä»¶åŒ {
// åŠç
// else ifã¯ããã€ã§ã
} else { // elseç¯ã¯çç¥å¯èœ
// åŠç
}
æ¡ä»¶ã¯äžããé çªã«è©äŸ¡ãããŸãã®ã§ãäžã®ã»ãã«ããifãŸãã¯if elseã§æ¡ä»¶ãæºããããå Žåãäžã®æ¹ã«ããif elseã§æ¡ä»¶ãåããã®ããã£ããšããŠãå®è¡ãããŸããã®ã§ã泚æããŸãããã
switch/caseæã¯äž»ã«ããã倿°ã®å€ã«ãã£ãŠæ¡ä»¶ãå€ããããšãã«äœ¿çšããŸãã
switch [åæåæ; ][åŒ] {
case åŒ[, åŒ]...:
// åŠç
// caseã¯ããã€ã§ã
default: // defaultã¯çç¥å¯èœ
// ã©ã®æ¡ä»¶ã«åœãŠã¯ãŸããªãã£ããšãã®åŠç
}
switch/caseæã¯äžããé çªã«åŒãè©äŸ¡ããŠãããæåã«switchã®åŒ == caseã®åŒ
ãtrue
ã®ãã®ãå®è¡ããŸããplay
// https://play.golang.org/p/GbOtt0GibQs
switch version {
case "1.0.0":
// version == "1.0.0"ã®æã®åŠç
fmt.Println("version 1.0.0")
case "2.0.0":
// version == "2.0.0"ã®æã®åŠç
fmt.Println("version 2.0.0")
}
caseã®åŒã«ã¯è€æ°ã®å€ãã«ã³ãåºåãã§æå®ããããšãã§ããŸããplay
// https://play.golang.org/p/SvoGCz1O6Ii
switch userType {
case "admin", "manager":
// userTypeã"admin"ã"manager"ã®æã®åŠç
fmt.Println("you're super user")
case "user":
// userTypeã"user"ã®æã®åŠç
fmt.Println("you're regular user")
}
switchã®åŒ
ãçç¥ãããå Žåã¯switchã®åŒ = true
ãšããŠæ±ãããŸããã€ãŸãã
switch true {
// ...
}
ãš
switch {
// ...
}
ã¯çãããšããããšã§ãããããå©çšããŠãif-if elseæã次ã®ããã«æžãæããããšãã§ããŸãã
if foo == bar {
// ...
} else if baz == qux {
// ...
} else if quux == corge {
// ...
}
switch {
case foo == bar:
// ...
case baz == qux:
// ...
case quux == corge:
// ...
}
è€æ°ã®if-if elese
ãã€ãªããããããã¡ãã®æ¹ãç°¡æœã§ãã€èªã¿ãããèšè¿°ã§ããå ŽåããããŸãã
äœããã®åŠçãç¹°ãè¿ãå®è¡ãããæã«ã¯ãforæã䜿çšããŸããä»ã®èšèªã§ã¯foræã®ä»ã«whileæãdo-whileæãšãã£ãæãçšæãããŠããããšããããŸãããGoèšèªã§ã¯ãã¹ãŠforæã§è¡ããŸãã 代ããã«ãGoèšèªã®foræã«ã¯äžã€ã®æžãæ¹ããããŸãã
äžã€ç®ã¯ããããæãäžè¬çãªforæã§ããfor
ã®åŸã«åæåæãæ¡ä»¶åŒãååæåæã;
(ã»ãã³ãã³)ã§åºåã£ãŠèšè¿°ããŸãã
for [åæåæ]; [æ¡ä»¶åŒ]; [ååæåæ] {
// åŠç
}
å®è¡ã®æµãã¯æ¬¡ã®ããã«ãªã£ãŠããŸãã
- åæåæãå®è¡ããããéåžžã¯å€æ°å®çŸ©ã»ä»£å ¥ãªã©ãè¡ãã
- æ¡ä»¶åŒãè©äŸ¡ããããåæåæã§åæåãã倿°ã䜿çšããããšãå€ãã
- 2.ã®è©äŸ¡çµæã
true
ãªãåŠçãè¡ããfalse
ãªãforæãæããã - åŠççµäºåŸãååæååãå®è¡ãããéåžžã¯åæåæã§åæåãã倿°ã«åä»£å ¥ãããªã©ããŠç¶æ³ãæŽæ°ããã
- 2.ã«ãã©ã
äŸãšããŠæ¬¡ã®ããã°ã©ã ã¯1ãã10ãŸã§ã®æ°åã衚瀺ããŸããplay
// https://play.golang.org/p/hv-JoJMyt8z
for i := 0; i < 10; i++ {
fmt.Println(i + 1)
}
// Output:
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10
åæåæãæ¡ä»¶åŒãååæåæã¯ããããçç¥ããããšãã§ããŸãã
äºã€ç®ã®æžãæ¹ã¯ãæ¡ä»¶åŒã®ã¿ãæžãæžãæ¹ã§ãã ããã¯ä»ã®èšèªã§èšããšããã®whileæã«çžåœããŸãã
for [æ¡ä»¶åŒ] {
// åŠç
}
ãŸãæ¡ä»¶åŒãè©äŸ¡ãããçµæãtrue
ãªãã°åŠçãè¡ããå床æ¡ä»¶åŒãè©äŸ¡ãã»ã»ã»ãšããã®ããæ¡ä»¶åŒã®çµæãfalse
ãšãªããŸã§ç¹°ãè¿ããŸããæ¬¡ã®äŸã¯å
ã»ã©ãšåæ§ã1ãã10ãŸã§è¡šç€ºããŸãã
// https://play.golang.org/p/xEryTwzfpWp
i := 0
for i < 10 {
fmt.Println(i + 1)
i++
}
// Output:
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10
for-rangeæ§æã¯é åãSliceãæååãMapã®èŠçŽ ããChannelããåãåãåèŠçŽ ã«å¯ŸããŠç¹°ãè¿ãåŠçãããããã®æ§æã§ããä»ã®èšèªã§ã¯ãæ¡åŒµforãããfor eachããªã©ã«çžåœããæ§æã§ãã
for [倿°ãªã¹ã [:]=] range ã³ã¬ã¯ã·ã§ã³ {
// åŠç
}
ã«ãŒãäžåãããã察象ã«ãã£ãŠäžã€ãäºã€ã®å€ãåãåãããšãã§ããŸããäºã€ã®å€ãåãåã察象ã®å Žåãäºã€ç®ã䜿çšããªãæã«ã¯çç¥ããããšãã§ããŸãã
arr := []string{"foo", "bar", "baz"}
// ããã
for i, _ := range arr {
// åŠç
}
// ããæžãããšãã§ãã
for i := range arr {
// åŠç
}
é å/Sliceã«å¯ŸããŠfor-rangeã䜿çšããå Žåãå€ã¯äºã€è¿ã£ãŠããŸããäžã€ç®ã¯é å/Sliceã®æ·»ãå(int)ã§ãäºã€ç®ã¯ãã®ã€ã³ããã¯ã¹ã§åŸãããå€ã§ããplay
// https://play.golang.org/p/_fkQhEMzEfc
arr := []string{"foo", "bar", "baz"}
for i, elem := range arr {
fmt.Println(i, elem)
}
// Output:
// 0 foo
// 1 bar
// 2 baz
æååã¯[]byte
ãšã»ãŒçããã§ããã[]byte
ã«å¯ŸããŠfor-rangeã䜿çšãããšäºã€ç®ã®å€ãšããŠbyte
ãåŸããã(ã€ãŸããæååäœã®ã«ãŒãã«ã¯ãªããªã)äžæ¹ãæååã«å¯ŸããŠfor-rangeã䜿çšãããšäºã€ç®ã®å€ãšããŠrune
ãåŸãããŸããããã¯UTF-8ã®æååäœã§ã«ãŒãããããšãå¯èœãšèšãããšã§ãããã ããäžã€ç®ã®å€ã¯ãã€ãæ°ãªã®ã§æ³šæããŠãã ãããplay
// https://play.golang.org/p/uBBa_qV40q4
s := "ããã«ã¡ã¯"
for i, elem := range s {
fmt.Printf("%d %c\n",i, elem) // %dã¯10鲿°ã®æŽæ°ãã%cã¯æå(rune)ã衚瀺ããããã®ãã©ãŒããã
}
// Output:
// 0 ã
// 3 ã
// 6 ã«
// 9 ã¡
// 12 ã¯
Mapã«å¯ŸããŠfor-rangeã䜿çšããå Žåãäžã€ç®ã®å€ãšããŠããŒããäºã€ç®ã®å€ãšããŠå¯Ÿå¿ããå€ãåŸãããŸããplay
// https://play.golang.org/p/AIqb4C1Bc2a
m := map[string]string{
"foo": "hoge",
"bar": "fuga",
"baz": "piyo",
}
for k, v := range m {
fmt.Println(k, v)
}
// Output:
// foo hoge
// bar fuga
// baz piyo
Channelã«å¯ŸããŠfor-rangeã䜿çšããå Žåãå€ã¯äžã€ã§ãChannelããéãããŠããå€ãåŸãããŸããChannelãcloseããããŸã§ã«ãŒããæããªããããæ³šæãå¿ èŠã§ããplay
// https://play.golang.org/p/l9hzUXfxyaH
ch := chMaker()
for v := range ch {
fmt.Println(v)
}
defer
ãä»ããŠé¢æ°ã®åŒã³åºãããããšããã®å Žã§ã¯å®è¡ãããããããåŒã°ãã颿°ã®çµäºæ(æåŸãŸã§å®è¡ããããšãããreturnãåŒã°ãããšã)ã«å®è¡ãããŸããã¡ãã£ãšãããã«ãããšæããŸãã®ã§ãäŸãèŠãŠã¿ãŸãããã
func 颿°å() {
// åŠç1
defer åŸåŠç()
// åŠç2
}
äžèšã®ããã«æžããå Žåãå®è¡é ã¯
- åŠç1
- åŠç2
- åŸåŠç()
ãšãªããŸããè€æ°defer
ã䜿ã£ãå Žåã¯ãäžããé ã«å®è¡ãããŸãã颿°å
ã®åŠçèªäœã¯äžããäžã§ããããäžããé ã«å®è¡ãããŠãããreturnãŸãã¯é¢æ°ã®æåŸã«å°éããããŸãäžã«æ»ã£ãŠããããšããæµãã ãšæãã°ããã§ããããplay
// https://play.golang.org/p/i1ckJXs1zBp
fmt.Println("first")
defer fmt.Println("fifth")
fmt.Println("second")
defer fmt.Println("fourth")
fmt.Println("third")
Goèšèªã§ã®ãšã©ãŒåŠçæ¹æ³ã¯å€§ããåããŠäºã€ãããŸãã
Goãçšããããã°ã©ãã³ã°ã®ç·Žç¿ãšããŠãFizzBuzzãå®è£ ããŠã¿ãŸããããFizzBuzzã¯ããã°ã©ãã³ã°ã®ç·Žç¿ã§ãã䜿çšããã課é¡ã®äžã€ã§ã次ã®ãããªãªãã®ã§ãã
- é çªã«æ°åã衚瀺ããŠãã(å ¥åããæ°åã察象ãšããå Žåããã)
- å¯Ÿè±¡ã®æ°åã3ã®åæ°ãªã Fizz ããå¯Ÿè±¡ã®æ°åã5ã®åæ°ãªã Buzz ãã3ãš5äž¡æ¹ã®åæ°ãªã FizzBuzz ãããã以å€ã®æ°åãªãæ°åããã®ãŸãŸã衚瀺ãã
1ãã20ãŸã§è¡šç€ºããäŸ:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizBuzz
16
17
Fizz
19
Buzz
ä»åã¯æ¬¡ã®æ§ãªä»æ§ã§å®è£ ããŠã¿ãŸãããã
- 1ããNãŸã§ã«ã€ããŠæ°åãé ã«è¡šç€ºãã
- Nã¯ã³ãã³ãã©ã€ã³åŒæ°ãããšã
- 衚瀺ããæ°åã3ã®åæ°ãªããæ°åã衚瀺ãã代ããã«"Fizz"ã衚瀺ãã
- 衚瀺ããæ°åã5ã®åæ°ãªããæ°åã衚瀺ãã代ããã«"Buzz"ã衚瀺ãã
- 衚瀺ããæ°åã3ã®åæ°ã§ããã€5ã®åæ°ã§ããããªããæ°åã衚瀺ãã代ããã«"FizzBuzz"ã衚瀺ãã
Hint:
- ã³ãã³ãã©ã€ã³åŒæ°ã¯
flag.Arg()
ãŸãã¯flag.Args()
ã䜿çšããŠåŸãããšãã§ããŸãã - æååããæ°å€ãžã®å€æã¯
strconv.Atoi()
ã䜿çšããŸãã
äžèšä»æ§ã§FizzBuzzãå®è£ ã§ãã人ã¯ã次ã®ä»æ§ã§å®è£ ããŠã¿ãŸãããã
- 1ããNãŸã§ã«ã€ããŠæ°åãé ã«è¡šç€ºãã
- Nã¯ã³ãã³ãã©ã€ã³åŒæ°ãããšã
- 衚瀺ããæ°åã3ã®åæ°ãã3ãå«ãæ°åãªããæ°åã衚瀺ãã代ããã«"Fizz"ã衚瀺ãã
Goèšèªã®éåžžã«å€§ããªç¹åŸŽãšããŠãèšèªã®ä»æ§ã¬ãã«ã§äžŠè¡åŠçããµããŒãããŠããããšãæããããŸããä»ã®èšèªã§ã¯äœ¿ãããšèªäœãå°ã é¢åãªããšãå€ã䞊è¡åŠçããGoèšèªã§ã¯ãšãŠãç°¡åã«äžŠè¡åŠçã䜿ã£ãããã°ã©ã ãæžãããšãã§ããŸãã
Goèšèªã§äžŠè¡åŠçãããã«ã¯ãgoroutine(ãããŒã¡ã/ããŒããŒã¡ã)ã䜿çšããŸããäœ¿çšæ¹æ³ã¯è³ã£ãŠç°¡åã§ã次ã®ããã«é¢æ°åŒã³åºãã®åã«go
ãšä»ããã ãã§ãã
go 颿°()
ãã£ãããã ãã§ãä»»æã®é¢æ°ã䞊è¡èµ·åããããšãã§ããŸãã
泚æããªããã°ãªããªãã®ã¯ã main
颿°ãçµäºãããããã°ã©ã ã®å®è¡èªäœãçµããããšããããš ã§ããgoroutineãããã€èµ·åãããŠããããšããmain
颿°ã®çµäºãšãšãã«ãã¹ãŠãçµäºããŸãããã®ãããéåžžã¯äœããã®æ¹æ³ã§(åŸè¿°ããŸã)goroutineãšã®åŸ
ã¡åãã(åæ)ãè¡ããŸããæ¬¡ã®äŸã§ã¯ãgoroutineã®äžã§æååã®åºåãè¡ãããŠããŸãããmain
颿°ã®ã»ããå
ã«çµãã£ãŠããŸãããã"this is goroutine"ãåºåãããŸãããplay
// https://play.golang.org/p/dzGSP5Pbilb
fmt. Println("hello")
go func() {
time.Sleep(5 * time.Second) // 5ç§äŒã: é·æéãããåŠçã®ä»£ãã
fmt.Println("this is goroutine")
}()
fmt.Println("hi")
泚æç¹ãšããŠãä»å玹ä»ããæ§ãªã³ãŒãçããç°¡åãªã³ãã³ãã©ã€ã³ããŒã«çã§ã¯ããŸãæ°ã«ããªããŠãåé¡ãããŸããããgoroutine㯠leakããŸããHTTPãµãŒãçã®ç¶ç¶çã«åãç¶ããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãgoroutineãäœæãããé©åã«çµäºãããªããšãèªåã§åé€ãããããšã¯ãããŸãããç¹ã«åŸè¿°ãããããªforæãšçµã¿åãããŠäœ¿ãå Žåãããããã¯ãç¶ãããããªåŠçãå«ãã§ããå Žåã«ã¯ãå¿ ãé©åãªåŠçãè¡ã£ãŠãã ãã(äŸãã°ãåŸè¿°ããcontext.Contextãªã©ã§ãã£ã³ã»ã«ããããªã©ãæå¹ã§ã)ã
åè¿°ã®æ§ã«ãgoroutineã¯go 颿°()
ã®åœ¢ã§åŒã³åºããŸããããã¯(åŒã³åºãã颿°ãè¿å€ãæã£ãŠããŠã)å€ãè¿ããªããããäœããã®å€ãåŸãããã«ã¯è¿å€ã§ã¯ãªããå¥ã®æ¹æ³ã䜿çšããå¿
èŠããããŸãããã®ãšãã«å©çšã§ããã®ããChannelã®ç¯ã§ç޹ä»ããChannelã§ããChannelã¯goroutineé(main()
ãå®è¡ãããŠããã®ãå®ã¯goroutineã®äžã€ã§ã)ã§å€ããããšãããããã®ä»çµã¿ã§ãã
Channelã¯éä¿¡åŽ/åä¿¡åŽãšãã«æºåãã§ããç¶æ ã«ãªããŸã§ã¯ãããã¯(åŠçãé²ãŸãªããªã)ããŸãããã®ãããChannelã¯goroutineéã®åŠçã®åæã«äœ¿çšããããšãã§ããŸããplay
// https://play.golang.org/p/nPFfRivvkJr
ch := make(chan string)
go func() {
time.Sleep(5 * time.Second) // 5ç§äŒã
ch <- "Hello"
}()
s := <- ch // chããå€ãéãããŠãããŸã§åŸ
ã€
fmt.Println(s)
select
æã¯switch
æã«éåžžã«ãã䌌ãŠããŸãããè€æ°ã®Channelã§äžçªæåã«åŠçããããã®ãéžæããããã®æ§æã§ãããŸãã¯äŸãèŠãŠã¿ãŸããããplay
// https://play.golang.org/p/1ygDWPQ91Gt
ch := make(chan string)
go func() {
time.Sleep(5 * time.Second) // é·ãåŠç
ch <- "Hello"
}()
select {
case s := <-ch:
fmt.Println(s)
case <-time.After(3 * time.Second): // time.Afterã¯chan time.Timeãè¿ããæå®ããæéã®åŸã«å€ãéãããŠãã
fmt.Println("3 seconds passed")
}
äžèšã®äŸã§ã¯ãäºã€ç®ã®caseã®æ¹ãå ã«åä¿¡æåããããã"3 seconds passed"ãããªã³ããããŸããselectæã§ã¯ãã¹ãŠã®caseã¯åæã«åŸ ã¡åããããŸãã
ãŸããäžèšã¯äŸã®ããselectååäœã§äœ¿çšããŸããããå€ãã®ã±ãŒã¹ã§ã¯æ¡ä»¶ãæå®ããŠããªã(=ç¡éã«ãŒããã)foræãšäœµããŠå©çšãããŸããplay
// https://play.golang.org/p/Iab77qnSTjy
done := make(chan struct{})
go func() {
time.Sleep(3 * time.Second)
done <- struct{}{}
close(done)
}()
for {
select {
case <-time.After(1 * time.Second):
fmt.Println("1 second passed")
case <-done:
fmt.Println("done!")
return
}
}
ãŸããifæã«ãããelseåŠçã®ããã«ã©ã®ã±ãŒã¹ãåœãŠã¯ãŸããªãå Žåã«ã¯default
ãšããã±ãŒã¹ãäœæããããšã§ãããã®ä»ãã®åŠçãèšè¿°ããããšãã§ããŸãã
syncããã±ãŒãžã¯éåæåŠçã«ãããåæåŠçã®ä»çµã¿ãããã€ãæäŸããŠããæšæºããã±ãŒãžã§ããããã§ã¯ãã䜿ããããã®ãããã€ã玹ä»ããŸãã
sync.WaitGroup
ã¯ãã®åã®éããgoroutineãã°ã«ãŒãåããŠããã®ãã¹ãŠã®goroutineãçµäºããã®ãåŸ
ã€ããã«äœ¿çšããæ§é äœã§ããç¹ã«åæåããããšãªã䜿çšå¯èœã§ããWaitGroup.Add(1)
ã§goroutineã®æ°ã远å ããåŸ
ã¡ããgoroutineãåŠççµäºããéã«WaitGroup.Done()
ãåŒã³ãŸããWaitGroup.Wait()
ã¯Add()
ããåæ°Done()
ãåŒã°ãããŸã§ãããã¯ããŸããæ³šæç¹ãšããŠãgoroutine㯠åŒã³åºãããã®å Žã§åŠçãéå§ãããšã¯éããªã ãããAdd()
ã¯goroutineã®å€ã§åŒã³ãDone()
ã¯goroutineã®äžã§åŒã¶ããã«ããŸããplay
// https://play.golang.org/p/EfpiGlkLOvx
var wg sync.WaitGroup // åæåãªãã§äœ¿çšã§ãã
for _, name := range []string{"Alice", "Bob", "Chris"} {
wg.Add(1) // goroutineã®åã§åŒã¶
go func(name string) {
defer wg.Done() // goroutineçµäºãdeferã䟿å©ã§ã
fmt.Println("hello, " + name)
}(name)
}
wg.Wait() // ãã¹ãŠã®goroutineãçµãããŸã§åŸ
ã€
fmt.Println("all goroutine have finished")
sync.Mutex
ã¯æä»å¶åŸ¡ã®ããã«äœ¿çšãããæ§é äœã§ããLock()
ãšUnlock()
ã®äºã€ã®ã¡ãœãããæã£ãŠããŸããLock()
ãåŒãã ãšããä»ã®å Žæã§ãã§ã«Lock()
ãåŒã°ããŠããå ŽåãUnlock()
ãåŒã°ãããŸã§ãããã¯ããŸãããã®ãããsync.Mutex
ã䜿çšããããšã§ãã倿°ãªã©ãè€æ°ã®goroutineãã倿Žãããããšãé²ãããšãã§ããŸãããŒãå€ã®sync.Mutex
ã¯ãã®ãŸãŸ(ç¹ã«åæåçããããšãªã)䜿çšããããšãã§ããŸããplay
// https://play.golang.org/p/jyDti7pQYLT
var wg sync.WaitGroup
// sync.Mutexãªãã®ã°ãã
for i := 0; i < 3; i++ {
wg.Add(1)
go func() {
fmt.Println("A")
time.Sleep(1 * time.Millisecond)
fmt.Println("B")
time.Sleep(1 * time.Millisecond)
fmt.Println("C")
wg.Done()
}()
}
wg.Wait()
fmt.Println("----")
// sync.Mutexããã®ã°ãã
var mu sync.Mutex // åæåãªãã§äœ¿ãã
for i := 0; i < 3; i++ {
wg.Add(1)
go func() {
mu.Lock()
defer mu.Unlock()
fmt.Println("A")
time.Sleep(1 * time.Millisecond)
fmt.Println("B")
time.Sleep(1 * time.Millisecond)
fmt.Println("C")
wg.Done()
}()
}
wg.Wait()
context.Contextã¯äž»ãšããŠgoroutineã®ãã£ã³ã»ã«åŠçãªã©ã«äœ¿çšãããæ§é äœã§ããäžäœã®goroutineããã£ã³ã»ã«ãããå Žå(äŸãã°ãsignalãåããŠã¢ããªã±ãŒã·ã§ã³ãçµäºãããHTTPã®ãªã¯ãšã¹ãããã£ã³ã»ã«ãããããªã©)ãäžäœã®goroutineã«ãã£ã³ã»ã«ãäŒæ¬ããæ©èœãæã£ãŠããŸããéåžžãcontext.ContextãåŸãã«ã¯ãcontext.Background()
ã䜿çšããŸãããã®ã»ããcontext.WithCancel()
ãcontext.WithDeadline()
ãcontext.WithTimeout()
ã䜿çšããããšã§ãã£ã³ã»ã«åŠçãã¿ã€ã ã¢ãŠãåŠçãç°¡åã«å®è£
ããããšãã§ããŸãã
ã³ã³ããã¹ãããã£ã³ã»ã«ãããå ŽåãContext.Done()
ã§åž°ã£ãŠãããã£ã³ãã«ãéãããããããselectæã§ã³ã³ããã¹ãã®çµäºãæ€ç¥ããããšãã§ããŸããæ¬¡ã®äŸã§ã¯ãgoroutineã§1ç§ããšã«ã«ãŠã³ãã¢ãããã10ç§åŸã«main()
ãããã£ã³ã»ã«ããŸããplay
// https://play.golang.org/p/T3L5QZkV4NB
ctx, cancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
var i int
for {
select {
case <-ctx.Done(): // cancel()ãåŒã°ãããšããã«å
¥ã
fmt.Println("canceled")
return
case <-time.After(1 * time.Second):
fmt.Println(i)
i++
}
}
}(ctx)
time.Sleep(10 * time.Second)
cancel()
å®éã«ã¯äžèšã®ãã£ã³ã»ã«åŠçã¯HTTPãªã¯ãšã¹ãã®ãã£ã³ã»ã«ãããšã©ãŒãçºçããæãªã©ã«è¡ãããŸãããã®ãããªã±ãŒã¹ã§ã¯context.WithTimeout()
ã䜿çšããŠå®è£
ããæ¹ãããã§ããããplay
// https://play.golang.org/p/IztyGR0PTPP
ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second)
defer cancel()
go func(ctx context.Context) {
var i int
for {
select {
case <-ctx.Done(): // ã¿ã€ã ã¢ãŠãã§ããã«å
¥ã
fmt.Println("timeout")
return
case <-time.After(1 * time.Second):
fmt.Println(i)
i++
}
}
}(ctx)
æ¯èŒçç°¡åãªäŸãšããŠãgoroutineãçšããgeneratorãäœã£ãŠã¿ãŸããããæ¬¡ã®æ§ãªä»æ§ã§å®è£ ããŠã¿ãŠãã ããã
- New颿°ã§ChannelãåŸã
- New颿°ã®åŒæ°ã¯èªç±
- åŸãããChannelããã¯intã®å€ã1ããé çªã«åŸããã
- ä»»æã®ã¿ã€ãã³ã°ã§generatorã®å©çšãçµäºã§ãã
- 䜿çšäŸ(ãã£ã³ã»ã«åŠçãå«ãã§ããŸãã):
generator := New(/* åŒæ°ã¯èªç±ã«æ±ºããŠãã ãã */)
for i := range generator {
fmt.Println(i)
}
// Output:
// 1
// 2
// 3
// ...ãšæ°žé ã«è¡šç€ºããç¶ãã
Hint:
close()
ããåŸã®Channelã«å€ãå ¥ããããšãããšpanic(ããã°ã©ã ã®ç°åžžçµäº)ããã®ã§ã泚æããŸããã- ä»»æã®ã¿ã€ãã³ã°ã§çµäº = goroutineããã£ã³ã»ã«
NewFizzBuzzGenerator
颿°- 1, 2, 3, ...ã®ä»£ããã«1, 2, Fizz, ...
ããŠãããã€ã端æã£ãŠããéšåããããŸãããããã§äžéãGoèšèªã®ä»æ§ã«ã€ããŠã¯åŠãã§ããŸãããããã§ãç°¡åãªWebã¢ããªã±ãŒã·ã§ã³ãäžã€å®è£ ããŠã¿ãŸãããã
Goèšèªã§ã¯ãHTTPã«é¢é£ããæšæºããã±ãŒãžãšããŠnet/httpãçšæãããŠããŸãããã®ãã¡ãä»åã®ããã«ç°¡åãªWebã¢ããªã±ãŒã·ã§ã³ã®å®è£ ãããã«ãããéèŠãªãã®ãšããŠã次ã®ãã®ãæããããŸã:
http.HandleFunc()
: ãã¹ãšhttp.HandlerFunc
ã®çµãæž¡ããŠãhttpããã±ãŒãžã®ããã©ã«ãHandlerã«HTTPã®ãšã³ããã€ã³ããèšå®ãã颿°ã§ããhttp.HandlerFunc
: 次ã«èª¬æããhttp.ResponseWriter
ãš*http.Request
ãåãåããåŠçããã颿°ã§ããhttp.HandleFunc
ã§èšå®ãããã¹ã«ã¢ã¯ã»ã¹ããã£ãå Žåã«åŒã³åºãããŸããhttp.ResponseWriter
: ãµãŒããã¯ã©ã€ã¢ã³ãã«å¯ŸããŠã¬ã¹ãã³ã¹ãè¿ãããã®é¢æ°ããŸãšããinterfaceã§ããWriteHeader(int)
ã§ã¹ããŒã¿ã¹ã³ãŒããèšå®ããWrite([]byte)
ã§bodyãã¯ã©ã€ã¢ã³ãã«éããŸããhttp.Request
: ãµãŒããã¯ã©ã€ã¢ã³ãããåãããªã¯ãšã¹ãã«é¢ããæ å ±ãå«ãã æ§é äœã§ããMethodãURLãHeaderãBodyãªã©ãå«ãŸããŸããhttp.ListenAndServe()
: å®éã«ãµãŒããå®è¡ãã第äžåŒæ°ã§äžããã¢ãã¬ã¹ã第äºåŒæ°ã§äžããHandlerã§åŸ ã¡åããŸãã第äºåŒæ°ãnilãªããhttpããã±ãŒãžã®ããã©ã«ãHandlerã䜿ãããŸãã
package main
import (
"fmt"
"net/http"
)
// Hello ã¯http.HandlerFuncãå®è£
ããŠãã颿°
func Hello(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) // 200 OKãèšå®
w.Write([]byte("Hello, world")) // bodyãšããŠã¡ãã»ãŒãžãéä¿¡
}
func main() {
http.HandleFunc("/hello", Hello) // /hello ãšãããã¹ã«ãªã¯ãšã¹ããæ¥ããHelloãåŒã¶
if err := http.ListenAndServe(":8080", nil); err != nil { // :8080ã§åŸ
ã¡åãã
fmt.Println(err.Error())
}
}
äžèšã®ã³ãŒããå®è¡ãããšã:8080
ã§HTTPãµãŒããåŸ
ã¡åããŸããäžèšã³ãŒããå®è¡ããã®ãšã¯å¥ã®ç«¯æ«ãèµ·åããæ¬¡ã®æ§ã«åäœã確èªããŠã¿ãŸãããã
$ curl http://localhost:8080/hello
Hello, world
ãšè¡šç€ºãããã°æåã§ãïŒ
ããã€ãæ¡ãçšæããŸããã®ã§ã次ã®äžããäžã€éžãã§å®è£ ããŠã¿ãŸããã(ãã¡ãããã奜ã¿ã®ãã¿ã§å®è£ ããŠã¿ãŠãOKã§ã)ã
- èªåã®èªå·±ç޹ä»ãªã©ãäœããã®HTMLããŒãžã衚瀺ãããããªãµãŒã
- é©åœãªãã£ã¬ã¯ããªã«ããããã¡ã€ã«ãè¿ã
Hint: net/httpããã±ãŒãžå ã«ããã¡ã€ã«ããµãŒãããããã«äœ¿ãã颿°ãããããçšæãããŠããŸãã
- æ°åŒãæž¡ããšçããè¿ã£ãŠãã
- POST
/calc
(bodyã«æ°åŒãå ¥ãã)ã§èšç®ããã
- TODOãªã¹ãã管çããã¢ããªã±ãŒã·ã§ã³
- GET
/items
ã§TODOã®äžèЧãè¿ã - POST
/item/create
ã§ã¢ã€ãã ã远å ãã - DELETE
/item
(ãããã«item IDãå ¥ãã)ã§ã¢ã€ãã ãåé€ãã
Hint: ä»åã¯ããŒã¿ããŒã¹ã®äœ¿ç𿹿³ã«ã€ããŠã¯åŠç¿ããŠããŸããã®ã§ãç°¡åã®ããMapã䜿çšãããšããã§ããã(database/sql
ãªã©ã䜿çšããŠãSQLããŒã¿ããŒã¹ã«å€ãæ ŒçŽããŠããã¡ããããŸããŸãã!)ã
- @tenntennããã«ãããã³ãºãªã³è³æã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãå®è£ ããŠã¿ã: LINK
- golang.tokyoã®ã³ãŒãã©ãã«ããè³æãèŠãªãããããå®çšçãªã¢ããªã±ãŒã·ã§ã³ãå®è£ ããŠã¿ã: LINK
- Women Who Go Tokyoã®ã³ãŒãã©ãã«ããè³æãèŠãªãããGCPäžã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŠã¿ã: LINK
- [Go](https://golang.org]
- Gopher slack
- #japan