ãšã³ããªãŒ
æç¶ãåããã°ã©ãã³ã°èšèªã®æãäžè¬çãªæ©èœã®1ã€ã¯ãé
åã®æŠå¿µã§ãã é
åã¯åçŽã«èŠãããããããŸããããäžæ¹ã§ãèšèªã«è¿œå ããåã«ã次ã®ãããªããã€ãã®åé¡ã解決ããå¿
èŠããããŸãã
- åºå®ãµã€ãºãå¯å€ãµã€ãºãïŒ
- ãµã€ãºã¯ã¿ã€ãã®äžéšã§ããïŒ
- 倿¬¡å
é
åã¯ã©ããªããŸããïŒ
- 空ã®é
åã®æŠå¿µã¯äœã§ããïŒ
ãããã®è³ªåã«å¯Ÿããçãã¯ãé
åãèšèªã®åçŽãªæ©èœãšããŠããŸãã¯ãã®èšèšã®äž»èŠéšåãšããŠå®çŸ©ããŸãã
Goã®åæã®é ããããã®è³ªåã«å¯ŸããçããèŠã€ããã«ã¯ãæŠå¿µãé©åãšæãããããã«ãªããŸã§ã«äœå¹Žãã®è°è«ãå¿
èŠã§ããã éèŠãªã¹ãããã¯ãæè»ã§æ¡åŒµå¯èœãªããŒã¿æ§é ãäœæããããã«ãåºå®ãµã€ãºã®é
åã«åºã¥ã
ã¹ã©ã€ã¹ã®æŠå¿µãäœæããããšã§ããã ãã ããGoã®æ°åè
ã®å€ãã¯ãããããä»ã®èšèªã§ã®çµéšããã®è¶³è·¡ãæ®ããããã«ãã¹ã©ã€ã¹ã®ååã«ã€ãŸãããŸãã
ãã®åºçç©ã§ã¯ãããããã¹ãŠã®èª€è§£ãææããããšããŸãã ããã¯ã
append颿°ãã©ã®ããã«æ©èœããã®ããããããªããã®ããã«æ©èœããã®ãããã以å€ã«ã¯äœãæ©èœããªãã®ãã説æããéšåã§å®çŸããŸãã
é
å
é
åã¯Goèšèªã®éèŠãªéšåã§ããã建ç©ã®åºç€ã®ããã«ãããç®ã«èŠããéšåã®äžã«é ãããŠããŸãã ããè峿·±ãã匷åã§ã泚ç®ã«å€ããã¹ã©ã€ã·ã³ã°æ©èœã«é²ãåã«ãææ°ã®ç¶æ
ã«ããå¿
èŠããããŸãã
Goã®ããã°ã©ã ã§ã¯ãé
åã®çš®é¡ã«ãµã€ãºãå«ãŸããããã䜿çšãå¶éããããããé
åã¯ããŸãèŠãããŸããã
ããšãã°ãåºåïŒ
var buffer [256]byte
256ãã€ããå«ã
ãããã¡ãŒå€æ°ãäœæããŸãã
ãããã¡ãŒå€æ°ã¿ã€ãã«ã¯ãµã€ãºãå«ãŸãã
[256] byteã®ããã«ãªã
ãŸã ã 512ãã€ãã®é
åã¯ãã¿ã€ã
[512] byteã«ãªããŸã ã
é
åã«é¢é£ä»ããããŠããããŒã¿ã¯ãåãªãèŠçŽ ã®é
åã§ãã æŠç¥çã«ãã¡ã¢ãªå
ã®ãããã¡ã¯æ¬¡ã®ããã«ãªããŸãã
buffer: byte byte byte ... 256 times ... byte byte byte
ã€ãŸãã倿°ã«ã¯256ãã€ãã®ããŒã¿ã ããå«ãŸããŸãã éåžžã®ã€ã³ããã¯ã¹æ§æ
ãããã¡[0] ã
ãããã¡[1]ãªã©ã䜿çšããŠ
ãããã¡[255]ã«èŠçŽ ã«ã¢ã¯ã»ã¹ã§ããŸãïŒ
0ã255ã®ã€ã³ããã¯ã¹ã¯256èŠçŽ ãã«ããŒããŸãïŒã ãã®ç¯å²ãè¶
ããããšãããšãããã°ã©ã ãã¯ã©ãã·ã¥ããŸãã
çµã¿èŸŒã¿ã®
len颿°ããããé
åãã¹ã©ã€ã¹ããã®ä»ã®åã®èŠçŽ æ°ãè¿ããŸãã æããã«ãé
åã«å¯ŸããŠ
lenãæ£ç¢ºã«è¿ããã®ã ãã®å Žåã
lenïŒãããã¡ïŒã¯256ãè¿ããŸãã
ã¢ã¬ã€ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®å ŽæãèŠã€ããããšãã§ããŸãã ããšãã°ããããªãã¯ã¹ã®å€æã«ã¯é©ããŠããŸãããGoã§ã®æãäžè¬çãªçšéã¯ã¹ã©ã€ã¹ã®ä¿åã§ãã
ã¹ã©ã€ã¹ïŒã¹ã©ã€ã¹ããããŒ
é¢çœãããšãèµ·ããã¹ã©ã€ã¹ã§ããã䜿çšãéå§ããåã«ããã®å¿
èŠæ§ãšäœãããŠããã®ããçè§£ããå¿
èŠããããŸãã
ã¹ã©ã€ã¹ã¯ãé
åã®è€æ°ã®ããŒãã£ã·ã§ã³ãèšè¿°ããããŒã¿æ§é ã§ããã倿°ãšã¯å¥ã«ä¿åãããŸãã
ã¹ã©ã€ã¹ã¯é
åã§ã¯ãããŸãã ã ã¹ã©ã€ã¹ã¯ãé
åã®äžéšã
衚ããŸãã
åã®ã»ã¯ã·ã§ã³ã®
ãããã¡ãŒé
åã䜿çšããå Žåãé
åãã¹ã©ã€ã¹ããããšã«ããã100ãã150ïŒæ£ç¢ºã«ã¯100ãã149ãŸã§ïŒã®èŠçŽ ãèšè¿°ããã¹ã©ã€ã¹ãäœæã§ããŸãã
var slice []byte = buffer[100:150]
ãã®ã³ãŒãã§ã¯ãæ£ç¢ºã«ã¯ãå®å
šãªå€æ°å®£èšã䜿çšããŸããã
ã¹ã©ã€ã¹å€æ°ã®ã¿ã€ãã¯
[] byteã§ ãããã€ãã®ã¹ã©ã€ã¹ããšããŠèªã¿åãããèŠçŽ 100ïŒå
æ¬çïŒãã150ïŒæä»çïŒã«ã¹ã©ã€ã¹ããããšã«ãã
ãããã¡é
åããäœæãããŸãã ãããæšæºçãªãæ§æã§ã¯ãåæåããã»ã¹äžã«å®çŸ©ãããåãçç¥ããŸãã
var slice = buffer[100:150]
ãããŠã颿°å
ã§ã¯ãçã圢åŒã®å®£èšã䜿çšããŸãã
slice := buffer[100:150]
ã¹ã©ã€ã¹ãšã¯äœã§ããïŒ ããã¯å®å
šãªèª¬æã§ã¯ãããŸããããä»åŸã¯ã¹ã©ã€ã¹ããé·ããšé
åèŠçŽ ãžã®ãã€ã³ã¿ãšãã2ã€ã®èŠçŽ ã§æ§æãããå°ããªæ§é ãšèããŠãã ããã ãããèå°è£ã§æ¬¡ã®ãããªãã®ãšèããŠãã ããã
type sliceHeader struct { Length int ZerothElement *byte } slice := sliceHeader{ Length: 50, ZerothElement: &buffer[100], }
ãã¡ãããããã¯åãªãäŸã§ãã ããã«ããããããããã®äŸããã¯ã
sliceHeaderæ§é äœ
ã¯ããã°ã©ããŒã«ã¢ã¯ã»ã¹ã§ããããã€ã³ã¿ãŒã®ã¿ã€ãã¯èŠçŽ ã®ã¿ã€ãã«äŸåããŸãããã¹ã©ã€ã¹ã®ä»çµã¿ã®åºæ¬çãªèãæ¹ãçè§£ããããšãã§ããŸãã
ãããŸã§ãé
åãã¹ã©ã€ã¹ããæäœã䜿çšããŸããããã¹ã©ã€ã¹ãã¹ã©ã€ã¹ããããšãã§ããŸãã
slice2 := slice[5:10]
åãšåãæ¹æ³ã§ããã®æäœã¯æ°ããã¹ã©ã€ã¹ãäœæããŸããããã®å Žåã¯å
ã®ã¹ã©ã€ã¹ã«é¢é£ããèŠçŽ 5ã9ïŒäž¡ç«¯ãå«ãïŒããäœæãããŸãã
slice2倿°ã®åºæ¬çãª
sliceHeaderæ§é ã¯
次ã®ããã«ãªããŸãã
slice2 := sliceHeader{ Length: 5, ZerothElement: &buffer[105], }
ããããŒã¯ã
ãããã¡å€æ°ã«ããåºã«ãªãé
åãæãããšã«æ³šæããŠãã ããã
å床ã«ããããããšãã§ããŸããããã¯ãã¹ã©ã€ã¹ãã«ããããã«ãããããã¹ã©ã€ã¹ã®æ§é ã«çµæãä¿åããããšãæå³ããŸãã ã€ãŸã åŸïŒ
slice = slice[5:10]
ã¹ã©ã€ã¹å€æ°ã®
sliceHeaderæ§é ã¯ã
slice2倿°ã®å Žåãšåãããã«
èŠããŸãã ããšãã°ãã¹ã©ã€ã¹ãã«ãããããªã©ããªãŒããŒã·ã¥ãŒããé »ç¹ã«çºçããŸãã ãã®äŸã§ã¯ãã¹ã©ã€ã¹ã®æåãšæåŸã®èŠçŽ ãçç¥ãããŸãã
slice = slice[1:len(slice)-1]
å€ãã®å Žåãçµéšè±å¯ãªGoããã°ã©ããŒãããã¹ã©ã€ã¹ããããŒãã«ã€ããŠèãããšãã§ããŸãã ããã¯ãã¹ã©ã€ã¹å€æ°ã«æ ŒçŽããããã®ã§ãã ããšãã°ã
bytes.IndexRuneãªã©ãã¹ã©ã€ã¹ãåŒæ°ãšããŠåã颿°ãåŒã³åºããšãããããŒã颿°ã«æž¡ãããŸãã ãã®äŸã§ã¯ïŒ
slashPos := bytes.IndexRune(slice, '/')
ã¹ã©ã€ã¹åŒæ°ã¯
IndexRune颿°ã«æž¡ãããŸããå®éãããã¯åãªããã¹ã©ã€ã¹ããããŒãã§ãã
ãã¹ã©ã€ã¹ããããŒãã«ã¯ã以äžã§èª¬æããå¥ã®ããŒã¿èŠçŽ ããããŸãããæåã«ãã¹ã©ã€ãµãŒã䜿çšããããã°ã©ã ãäœæãããšãã®ãã¹ã©ã€ã¹ããããŒãã®æå³ãèŠãŠã¿ãŸãããã
ã¹ã©ã€ã¹ã颿°ã«æž¡ã
ã¹ã©ã€ã¹ã«ãã€ã³ã¿ãŒãå«ãŸããŠããŠããããèªäœãå€ã§ããããšãçè§£ããããšãéåžžã«éèŠã§ãã å
éšã§ã¯ãããã¯ãã€ã³ã¿ãŒãšé·ããå«ãæ§é ã§ãã ããã¯æ§é äœãž
ã®ãã€ã³ã¿ã§ã¯ãã
ãŸãã ã
ããã¯éèŠã§ãã
åã®äŸã§
IndexRuneãåŒã³åºã
ãšã ãããããŒã®äžéšãã®
ã³ããŒã ååŸãããŸãã ãã®åäœã¯éèŠãªçµæããããããŸãã
ç°¡åãªé¢æ°ãèããŠã¿ãŸãããïŒ
func AddOneToEachElement(slice []byte) { for i := range slice { slice[i]++ } }
圌女ã¯ã¿ã€ãã«ã«æžãããŠããããšãæ£ç¢ºã«è¡ããŸãã ïŒ
for rangeã«ãŒãã䜿çšã
㊠ïŒãã¹ãŠã®ã¹ã©ã€ã¹èŠçŽ ããã©ããŒã¹ããèŠçŽ ãå¢ãããŸãã
詊ããŠãã ããïŒ
func main() { slice := buffer[10:20] for i := 0; i < len(slice); i++ { slice[i] = byte(i) } fmt.Println("before", slice) AddOneToEachElement(slice) fmt.Println("after", slice) }
ã
ã¹ã©ã€ã¹ããã㌠ãã¯é¢æ°ã«æž¡ãããŸãããé
åã®èŠçŽ ãžã®ãã€ã³ã¿ãŒãå«ãŸããŠãããããå
ã®ã¹ã©ã€ã¹ããããŒãšãã®ã³ããŒã¯åãé
åã衚ããŸãã ãã®çµæã颿°ãçµäºãããšã倿ŽãããèŠçŽ ãå
ã®ã¹ã©ã€ã¹ããèŠãããšãã§ããŸãã
颿°ãžã®åŒæ°ã¯å®éã«ã¯ã³ããŒã§ããããã®äŸã¯ããã瀺ããŠããŸãã
func SubtractOneFromLength(slice []byte) []byte { slice = slice[0 : len(slice)-1] return slice } func main() { fmt.Println("Before: len(slice) =", len(slice)) newSlice := SubtractOneFromLength(slice) fmt.Println("After: len(slice) =", len(slice)) fmt.Println("After: len(newSlice) =", len(newSlice)) }
ããã§ã¯ã颿°
ã§ã¯åŒæ°ã®
å
容ã倿Žã§ããŸããã
ã¿ã€ãã«ã§ã¯å€æŽã§ããªãããšãããããŸãã é·ãã¯
ã¹ã©ã€ã¹å€æ°ã«æ ŒçŽããã颿°ãåŒã³åºããŠã倿ŽãããŸãããããã¯ãã¹ã©ã€ã¹ããããŒã®ã³ããŒãå
ã®ãã®ã§ã¯ãªã颿°ã«æž¡ãããããã§ãã ãããã£ãŠãã¿ã€ãã«ã倿Žãã颿°ãäœæããå Žåã¯ãäŸã§è¡ã£ãããã«ããããè¿ãå¿
èŠããããŸãã
ã¹ã©ã€ã¹å€æ°ã¯å€æŽãããŸããããæ»ãå€ã«ã¯æ°ããé·ãããããããã¯
newSliceã«æ ŒçŽãã
ãŸã ã
ã¹ã©ã€ãµãŒãã€ã³ã¿ãŒïŒçç£æ¹æ³
ã¹ã©ã€ã¹ããããŒã倿Žãã颿°ãèšè¿°ããå¥ã®æ¹æ³ããããŸããããã¯ãã¹ã©ã€ã¹ãžã®ãã€ã³ã¿ãŒã颿°ã«æž¡ãããšã§ãã ãã®æ©èœã瀺ãããã®äŸã®ããªãšãŒã·ã§ã³ã次ã«ç€ºããŸãã
func PtrSubtractOneFromLength(slicePtr *[]byte) { slice := *slicePtr *slicePtr = slice[0 : len(slice)-1] } func main() { fmt.Println("Before: len(slice) =", len(slice)) PtrSubtractOneFromLength(&slice) fmt.Println("After: len(slice) =", len(slice)) }
æœè±¡åã®ã¬ãã«ïŒäžæå€æ°ïŒãäœåã§ãããããäŸã¯å°ãåä»ã«æãããããããŸããããã¹ã©ã€ã¹ãžã®ãã€ã³ã¿ãŒã䜿çšããå Žåã1ã€ãããŸãã ã¹ã©ã€ã¹ã倿Žããã¡ãœãããèšè¿°ãããšããã¬ã·ãŒããŒãšããŠãã€ã³ã¿ãŒã䜿çšããã®ãæ
£äŸã§ãã
æåŸã®ã¹ã©ãã·ã¥ãåé€ããæ¹æ³ãå¿
èŠã ãšããŸãããã æ¬¡ã®ããã«èšè¿°ã§ããŸãã
type path []byte func (p *path) TruncateAtFinalSlash() { i := bytes.LastIndex(*p, []byte("/")) if i >= 0 { *p = (*p)[0:i] } } func main() { pathName := path("/usr/bin/tso")
ãã®äŸãå®è¡ãããšãå¿
èŠãªããšãèµ·ããããšãããããŸããã€ãŸããã¡ãœãããã¹ã©ã€ã¹ã倿ŽããŸãã
äžæ¹ãASCIIæåã®å€§æåãèšå®ãã
ãã¹ã®ã¡ãœãããäœæããå ŽåïŒè±èªã®æåã§åäœãå®çŸ©ãããŠããªãå ŽåïŒãã¬ã·ãŒããŒã®å€ã¯å¿
èŠãªé
åãæããããã¡ãœããã¯ãã€ã³ã¿ãŒã§ã¯ãªãå€ãæäœã§ããŸãã
type path []byte func (p path) ToUpper() { for i, b := range p { if 'a' <= b && b <= 'z' { p[i] = b + 'A' - 'a' } } } func main() { pathName := path("/usr/bin/tso") pathName.ToUpper() fmt.Printf("%s\n", pathName) }
ããã§ã
ToUpperã¡ãœããã¯ãèŠçŽ ã®ã€ã³ããã¯ã¹ã䜿çšããããã«
forç¯å²ã§2ã€ã®å€æ°ã䜿çšããã¹ã©ã€ã¹èŠçŽ èªäœãçŽæ¥äœ¿çšããŸãã ããã«ããã
p [i]ãžã®åæžã蟌ã¿ãåé¿ãããŸãã
å容人æ°
次ã®é¢æ°ãèããŠãã ãããããã¯ã
intã®ã¹ã©ã€ã¹ã1èŠçŽ ã ãå¢ãã
ãŸã ã
func Extend(slice []int, element int) []int { n := len(slice) slice = slice[0 : n+1] slice[n] = element return slice }
次ã«å®è¡ããŸãïŒ
func main() { var iBuffer [10]int slice := iBuffer[0:0] for i := 0; i < 20; i++ { slice = Extend(slice, i) fmt.Println(slice) } }
...ã¹ã©ã€ã¹ãæé·ãããŸã§ãã©ã®ããã«æé·ããããèŠãŠã¿ãŸãããã
ã¹ã©ã€ã¹ããããŒã®3çªç®ã®ã³ã³ããŒãã³ãã§ãã
容éã«ã€ããŠèª¬æããŸãã é
åãžã®ãã€ã³ã¿ãŒãšãã®é·ãã«å ããŠãã¹ã©ã€ã¹ããããŒã«ã¯ãã®å®¹éãå«ãŸããŸãã
type sliceHeader struct { Length int Capacity int ZerothElement *byte }
[
Capacity]ãã£ãŒã«ãã«ã¯ãã¢ã¬ã€ãå®éã«å æããã¹ããŒã¹ã®ã¬ã³ãŒããå«ãŸããŸã-ããã¯ã
Lengthãå°éã§ããæå€§å€ã§ãã 容éãè¶
ããŠã«ãããå¢ãããšãã¢ã¬ã€ãæµåºããç·æ¥ããã°ã©ã ãçµäºããŸãã
ãã®äŸã§ã¯ãã¹ã©ã€ã¹ãäœæããŸã
slice := iBuffer[0:0]
ãã®ã¿ã€ãã«ã¯æ¬¡ã®ããã«ãªããŸãã
slice := sliceHeader{ Length: 0, Capacity: 10, ZerothElement: &iBuffer[0], }
[
容é]ãã£ãŒã«ãã¯ãå
ã®é
åã®é·ãããé
åèŠçŽ ã®ã€ã³ããã¯ã¹ãåŒãããã®ã«çžåœããŸããããã¯ãæåã®ã¹ã©ã€ã¹èŠçŽ ïŒãã®å Žåã¯ãŒãïŒã§ãã ã¹ã©ã€ã¹ã®å®¹éãç¥ãããå Žåã¯ã
cap颿°ã䜿çšããŸãã
if cap(slice) == len(slice) { fmt.Println("slice is full!") }
äœã
容éãããã«ãããå¢ããããå Žåã¯ã©ãããã°ããã§ããïŒ ã§ããŸããïŒ å®çŸ©ã§ã¯ã容éãæé·ã®éçã§ãã ããããæ°ããé
åãäœæããããŒã¿ãã³ããŒããæ°ããé
åãèšè¿°ããã¹ã©ã€ã¹ã倿Žããããšã§åãçµæãåŸãããšãã§ããŸãã
匷調衚瀺ããå§ããŸãããã
æ°ãã颿°ã䜿çšããŠãã倧ããªé
åãå²ãåœãŠããã倧ããªã¹ã©ã€ã¹ã
äœæã§ããŸããã
make颿°ã䜿çšããæ¹ãç°¡åã§ãã æ°ããé
åãéžæããã¹ã©ã€ã¹ããããŒãäœæããŸãã
make颿°ã«ã¯3ã€ã®åŒæ°ããããŸããã¹ã©ã€ã¹ã¿ã€ããåæé·ãããã³ãã®å®¹éã§ããããã§ãé
åã®é·ãã¯ã
makeãã¹ã©ã€ã¹ããŒã¿ã«å²ãåœãŠããã®ã§ãã ãã®çµæããã®é¢æ°åŒã³åºãã¯é·ã10ã®ã¹ã©ã€ã¹ãäœæãã5ïŒ15-10ïŒã§æ¡åŒµããå¯èœæ§ããããŸãããããå®è¡ãããšç¢ºèªã§ããŸãã
slice := make([]int, 10, 15) fmt.Printf("len: %d, cap: %d\n", len(slice), cap(slice))
ãã®ã¹ããããã¯ã
intã¹ã©ã€ã¹ã®å®¹éã2åã«ããŸãããåãé·ããæ®ããŸãã
slice := make([]int, 10, 15) fmt.Printf("len: %d, cap: %d\n", len(slice), cap(slice)) newSlice := make([]int, len(slice), 2*cap(slice)) for i := range slice { newSlice[i] = slice[i] } slice = newSlice fmt.Printf("len: %d, cap: %d\n", len(slice), cap(slice))
ãã®åŸãã¹ã©ã€ã¹ã«ã¯ãå¥ã®åé
åžãå¿
èŠã«ãªãåã«ãæé·ããäœå°ãã¯ããã«å€§ãããªããŸãã
ã¹ã©ã€ã¹ãäœæãããšããé·ããšå®¹éããŸã£ããåãã«ãªãããšããããããŸãã
make颿°ã«ã¯ççž®ããŒãžã§ã³ããããŸãã ããã©ã«ãã®é·ãã容éã«ãªããããåäžã®å€ã§æå®ã§ããŸãã åŸ
gophers := make([]Gopher, 10)
gophersã¹ã©ã€ã¹
ã§ã¯ãé·ããšå®¹éã¯10ã«ãªããŸãã
ã³ããŒ
åã®ã»ã¯ã·ã§ã³ã§ã¹ã©ã€ã¹ã®å®¹éã2åã«ããåŸãã«ãŒããæžãæããŠå€ãããŒã¿ãæ°ããã¹ã©ã€ã¹ã«ã³ããŒããŸããã Goã«ã¯ããã®ã¿ã¹ã¯ãç°¡çŽ åããçµã¿èŸŒã¿ã®
ã³ããŒæ©èœããããŸãã 圌女ã®åŒæ°ã¯2ã€ã®ã¹ã©ã€ã¹ã§ã圌女ã¯ããŒã¿ãå³ããå·Šã®ã¹ã©ã€ã¹ã«ã³ããŒããŸãã
copyã䜿çšããããã«æžãçŽããäŸã次ã«ç€ºã
ãŸã ã
newSlice := make([]int, len(slice), 2*cap(slice)) copy(newSlice, slice)
ã³ããŒæ©èœã¯ã¹ããŒãã§ãã äž¡æ¹ã®åŒæ°ã®é·ãã«æ³šæããŠãã§ããããšã ããã³ããŒããŸãã ã€ãŸããã³ããŒãããèŠçŽ ã®æ°ã¯ãäž¡æ¹ã®ã¹ã©ã€ã¹ã®é·ãã®æå°å€ã«çãããªããŸãã ããã¯å°ãã®ãå®å䞻矩ããæãããšãã§ããŸãã ããã«ã
copyã¯æŽæ°å€ïŒã³ããŒãããèŠçŽ ã®æ°ïŒãè¿ããŸãããããã¯åžžã«ç¢ºèªãã䟡å€ããããšã¯éããŸããã
ã³ããŒæ©èœã¯ããœãŒã¹ãšã¬ã·ãŒããŒã亀差ããå Žåãèæ
®ããŸãïŒçŽTransãããã¯Cã®memmoveïŒïŒã«äŒŒãŠããŸãïŒãã€ãŸãããã®æ©èœã䜿çšããŠ1ã€ã®ã¹ã©ã€ã¹å
ã®èŠçŽ ãç§»åã§ããŸãã 以äžã¯ã
ã³ããŒæ©èœã䜿çšããŠã¹ã©ã€ã¹ã®äžå€®ã«å€ã貌ãä»ããæ¹æ³ã®äŸã§ãã
ãã®æ©èœã«ã¯ãããã€ãã®æ³šæç¹ããããŸãã ãŸããæãããªããšã§ãããé·ãã倿ŽãããŠãããããã¹ã©ã€ã¹ãè¿ãå¿
èŠããããŸãã 第äºã«ã䟿å©ãªåçž®ã䜿çšãããŸãã 衚çŸ
slice[i:]
ãšåãããšãæå³ããŸã
slice[i:len(slice)]
ããã«ãå¥ã®ããªãã¯ã䜿çšããŸããã§ãããåŒã®æåã®èŠçŽ ã空ã®ãŸãŸã«ããããšãã§ããŸãã ããã©ã«ãã§ã¯ãŒãã«ãªããŸãã ãã®ããã«
slice[:]
ããã¯åã«ããèªäœãã¹ã©ã€ã¹ããããšãæå³ããé
åãã¹ã©ã€ã¹ãããšãã«äŸ¿å©ã§ãã ãã®åŒã¯æçã§ãïŒãé
åã®ãã¹ãŠã®èŠçŽ ãèšè¿°ããã¹ã©ã€ã¹ãïŒ
array[:]
ããããããã¯ã±ãŒã¹ãšã±ãŒã¹ã®éã«ãããŸããã
æ¿å
¥é¢æ°ã詊ããŠã¿ãŸãããã
slice := make([]int, 10, 20)
æ¿å
¥ïŒäŸ
æ°ã»ã¯ã·ã§ã³åã«ã1ã€ã®èŠçŽ ã§ã¹ã©ã€ã¹ãæ¡åŒµãã
Extend颿°ãäœæããŸããã ã¹ã©ã€ã¹ã®å®¹éãå°ããããå Žåã«ã®ã¿æ©èœã倱æããå¯èœæ§ããããšããçç±ã ãã§ãééã£ãŠããŸããïŒãã®äŸã§ã¯ã
æ¿å
¥æ©èœã«ãåãåé¡ãçºçããŸãïŒã ããã§ä¿®æ£æ¹æ³ãããã£ãã®ã§ãæŽæ°ã¹ã©ã€ã¹çšã®
Extend颿°ã®ä¿¡é Œã§ããå®è£
ãäœæããŸãããã
func Extend(slice []int, element int) []int { n := len(slice) if n == cap(slice) {
ãã®å Žåãã¹ã©ã€ã¹ãè¿ãããšãç¹ã«éèŠã§ãããªããªããã¹ã©ã€ã¹ãåé
åžãããšãååŸããã¹ã©ã€ã¹ããŸã£ããç°ãªãé
åãèšè¿°ããããã§ãã ã¹ã©ã€ã¹ããã£ã±ãã«ãªã£ãå Žåã«äœãèµ·ãããã瀺ãããã®å°ããªã¹ã©ã€ã¹ã次ã«ç€ºããŸãã
slice := make([]int, 0, 5) for i := 0; i < 10; i++ { slice = Extend(slice, i) fmt.Printf("len=%d cap=%d slice=%v\n", len(slice), cap(slice), slice) fmt.Println("address of 0th element:", &slice[0]) }
ãµã€ãº5ã®åæé
åããã£ã±ãã«ãªã£ããšãã®åé
åžã«æ³šæããŠãã ããã æ°ããé
åãå²ãåœãŠããããšãnullã¢ã€ãã ã®å®¹éãšã¢ãã¬ã¹ãå€ãããŸãã
å
ç¢ãª
Extend颿°ãããŒã¹ãšããŠäœ¿çšãããšãã¹ã©ã€ã¹ãè€æ°ã®èŠçŽ ã§æ¡åŒµã§ããããã«åªãã颿°ãäœæã§ããŸãã ãããè¡ãã«ã¯ãåŒæ°ã®ãªã¹ããé
åã«å€æããGoã®æ©èœãå©çšããŸãã ã€ãŸããå¯å€æ°ã®é¢æ°åŒæ°ã䜿çšããGoã®æ©èœã䜿çšããŸãã
颿°
appendãåŒã³åºããŸãããã æåã®ããŒãžã§ã³ã§ã¯ã颿°ã®åŒæ°ããªããªããŸã§
ExtendãåŒã³åºãããšãã§ããŸãã
Append颿°ã®ãããã¿ã€ãã¯æ¬¡ã®ããã«ãªããŸãã
func Append(slice []int, items ...int) []int
ããã¯ã
Appendã1ã€ã®åŒæ°ïŒã¹ã©ã€ã¹ïŒãåããããã
intåã®åŒæ°ã®ãŒãããç¡éãŸã§ç¶ãããšã瀺ããŠããŸãã ã芧ã®ããã«ããããã®èŠçŽ ã¯å°æ¥ã®ã¹ã©ã€ã¹ã¹ã©ã€ã¹ã§ãã
forã¬ã³ãžã«ãŒãã¯ã
[] intåã®
itemsåŒæ°ã®åèŠçŽ ã«å¯ŸããŠå®è¡ãããããšã«æ³šæããŠãã ããã ãŸãã空ã®èå¥å_ã䜿çšããŠããããšã«æ³šæããŠãã ãããããã¯ã€ã³ããã¯ã¹ãç Žæ£ããŸããããã¯ã«ãŒãã§ã¯å¿
èŠãªãããã§ãã
ããã詊ããŠãã ããïŒ
slice := []int{0, 1, 2, 3, 4} fmt.Println(slice) slice = Append(slice, 5, 6, 7, 8) fmt.Println(slice)
ãã®äŸã®ãã1ã€ã®æ°ããããªãã¯ã¯ãã¹ã©ã€ã¹ã®åæåããäžæ¬åŒ§ã§å²ãŸããåãšã¹ã©ã€ã¹èŠçŽ ã§æ§æãããè€åãªãã©ã«ã§è¡ãããããšã§ãã
slice := []int{0, 1, 2, 3, 4}
远å ãå¥ã®çç±ã§è峿·±ãã§ãã èŠçŽ ã远å ããã ãã§ãªãã...ã䜿çšããŠã¹ã©ã€ã¹ãåŒæ°ãšããŠé¢æ°ã«æž¡ãããšãã§ããŸãã
slice1 := []int{0, 1, 2, 3, 4} slice2 := []int{55, 66, 77} fmt.Println(slice1) slice1 = Append(slice1, slice2...)
ãã¡ããã
Extendã«åºã¥ããåäžéžæã«ããã
Appendãããå¹ççã«ããããšãã§ããŸãã
ããã§ã¯ã
ã³ããŒã 2å䜿çšããŠããŒã¿ã¹ã©ã€ã¹ãæ°ããã¡ã¢ãªã«ç§»åãã远å ããã¢ã€ãã ãå€ãããŒã¿ã®æåŸã«ã³ããŒããŸãã
詊ããŠã¿ãŠãã ãããåäœã¯ä»¥åãšåãã§ãïŒ
slice1 := []int{0, 1, 2, 3, 4} slice2 := []int{55, 66, 77} fmt.Println(slice1) slice1 = Append(slice1, slice2...)
远å ïŒçµã¿èŸŒã¿é¢æ°
ãã®ãããGoã§ã¯çµã¿èŸŒã¿é¢æ°
appendã远å ããå¿
èŠããããšããçµè«ã«éããŸããã äŸã®
Append颿°ãšåãããšãåãå¹çã§è¡ããŸãããã©ã®ã¿ã€ãã®ã¹ã©ã€ãµãŒã§ãæ©èœããŸãã
Goã®åŒ±ç¹ã¯ãããžã§ããªãã¯åãã§å®çŸ©ãããæäœãå®è¡æã«æäŸããå¿
èŠãããããšã§ãã ãã€ãããã¯å€ãããããããŸããããã¹ã©ã€ãµãŒã§ã®äœæ¥ãç°¡çŽ åããããã«ãGoã¯çµã¿èŸŒã¿ã®äžè¬é¢æ°
appendãæäŸã
ãŸã ã æŽæ°ããŒãžã§ã³ãšåãããã«æ©èœããŸããã
ã©ã®ã¿ã€ãã®ã¹ã©ã€ã¹ã§ãæ©èœããŸãã
appendãåŒã³åºããã³ã«ã¹ã©ã€ã¹ããããŒãæŽæ°ããããããåŒã³åºãåŸã«çµæã®ã¹ã©ã€ã¹ãä¿åããå¿
èŠãããããšã«æ³šæããŠãã ããã å®éãã³ã³ãã€ã©ãŒã¯ãçµæãä¿åããã«
appendãåŒã³åºãããšãèš±å¯ããŸããã
åäžè¡ã®åºåãæ¬¡ã«ç€ºããŸãã ãããã詊ããŠã倿ŽããŠæ¢çŽ¢ããŠãã ããïŒ
忢ããŠäŸã®æåŸã®è¡ã«ã€ããŠèããã¹ã©ã€ã¹ã®èšèšã«ãã£ãŠãã®ãããªåçŽãªåŒã³åºããæ£ããè¡ãããšãã§ããæ¹æ³ãçè§£ããå¿
èŠããããŸãã
Slice Tricks wikiïŒã³ãã¥ããã£äœæïŒã«ã¯ã
append ã
copyããã®ä»ã®ã¹ã©ã€ã¹ã®äœ¿ç𿹿³ã䜿çšããå€ãã®äŸããã
ãŸã ã
ãªã
ããã«ãæ°ããç²åŸããç¥èã䜿çšããŠãããŒããã«ãããšã¯äœããçè§£ã§ããŸãã åœç¶ãããã¯ã¹ã©ã€ã¹ããããŒã®nullå€ã§ãã
sliceHeader{ Length: 0, Capacity: 0, ZerothElement: nil, }
ãŸãã¯åã«
sliceHeader{}
éèŠãªã®ã¯ããã€ã³ã¿ãŒã
nilã§ãããšããããšã§ãã ãã®ã¹ã©ã€ã¹
array[0:0]
é·ãã¯ãŒãã§ããïŒå®¹éããŒãã®å ŽåããããŸãïŒããã®ãã€ã³ã¿ãŒã¯
nilã§ã¯ãªãããããŸã ãŒãã¹ã©ã€ã¹ã§ã¯ãããŸããã
æããã«ã空ã®ã¹ã©ã€ã¹ã¯æé·ã§ããŸãïŒå®¹éããŒãã§ãªããšä»®å®ããŸãïŒãããnilãïŒ
nil ïŒã¹ã©ã€ã¹ã«ã¯ãå°ãªããšã1ã€ã®èŠçŽ ãå«ãŸããŠããŠããå€ãå
¥ããŠæé·ã§ããªãé
åã¯å«ãŸããŸããã
äœã瀺ããªãå Žåã§ãããnilãã¹ã©ã€ã¹ã¯é·ãããŒãã®ã¹ã©ã€ã¹ãšæ¬è³ªçã«åçã§ããããšã«æ³šæããŠãã ããã
é·ãã¯ãŒãã§ãéžæããŠäœãã远å ã§ããŸããäžäŸãšããŠãã¹ã©ã€ã¹ãããŒã»ïŒè¿œå ããããšã«ãã£ãŠãã³ããŒãããäžèšã®æ°è¡ãèŠãŒãïŒã¹ã©ã€ã¹ãè¡
次ã«ãã¹ã©ã€ã¹ã®ã³ã³ããã¹ãã§ã®Goã®è¡ã«ã€ããŠç°¡åã«èª¬æããŸããå®éãæååã¯éåžžã«åçŽã§ãããããã¯èªã¿åãå°çšã®ãã€ãã¹ã©ã€ã¹ã§ãããèšèªããå°ãäœåãªæ§æãµããŒãããããŸããèªã¿åãå°çšã§ããããã容éã¯ãããŸããïŒå¢ããããšã¯ã§ããŸããïŒããã»ãšãã©ã®å Žåããã€ãã®ã¹ã©ã€ã¹ãšããŠæ±ãããšãã§ããŸãããŸããã€ã³ããã¯ã¹ã䜿çšããŠåã
ã®ãã€ãã«ã¢ã¯ã»ã¹ã§ããŸãã slash := "/usr/ken"[0]
æååãã¹ã©ã€ã¹ããŠãµãã¹ããªã³ã°ãäœæã§ããŸãã usr := "/usr/ken"[0:4]
糞ãåããšãã«ã«ãŒãã³ã®åŸãã§äœãèµ·ãããã¯æããã§ãããããã£ãŠãåçŽãªå€æã«ãã£ãŠãéåžžã®ãã€ãã¹ã©ã€ã¹ãååŸããããããæååãäœæã§ããŸãã str := string(slice)
ãŸããæååãããã€ãã®ã¹ã©ã€ã¹ãäœæããŸãã slice := []byte(usr)
æååã®åºç€ãšãªãé
åã¯ãã¥ãŒããé ãããŠããŸããæååãä»ããŠã¢ã¯ã»ã¹ããæ¹æ³ã¯ãããŸãããããã¯ããããã®å€æãè¡ããšãã«ãé
åã®ã³ããŒãäœæããå¿
èŠãããããšãæå³ããŸãã Goãä»äºãåŒãåããã®ã§ãå¿é
ããå¿
èŠã¯ãããŸããããã®ãããªå€æã®åŸãåºç€ãšãªããã€ãã¹ã©ã€ã¹ã®é
åã倿ŽããŠãã察å¿ããè¡ã«ã¯åœ±é¿ããŸãããæååã®ã¹ã©ã€ã¹ãšåæ§ã®åäœã®éèŠãªçµæã¯ãéšåæååã®äœæãéåžžã«å¹ççã§ããããšã§ããå¿
èŠãªã®ã¯ãè¡ã®2ã€ã®äžéšãäœæããããšã ãã§ããæååã¯èªã¿åãå°çšãªã®ã§ãå
ã®æååãšã¹ã©ã€ã¹ã®çµæãšããŠååŸãããæååã¯ãåãé
åãå®å
šã«å
±æã§ããŸããæŽå²çãªã¡ã¢ïŒåæã®æååå®è£
ã¯åžžã«åå¥ã«éç«ã£ãŠããŸãããããã以éãèšèªã«ã¹ã©ã€ã¹ãç»å Žããæååãããå¹ççã«åŠçã§ããããã«ãªããŸãããäžéšã®ãã³ãããŒã¯ã§ã¯ãé床ã倧å¹
ã«åäžãå§ããŸããããã¡ãããè¡ã«ã€ããŠè©±ãããšã¯ãã£ãšãããããããŸããããã®ãããã¯ã¯å¥ã®åºçç©ã®ããã®ãã®ã§ãããããã«
ã¹ã©ã€ã¹ã®åçãçè§£ããããšã¯ãããããã©ã®ããã«äœãããããçè§£ããã®ã«åœ¹ç«ã¡ãŸããå°ããªããŒã¿æ§é ãã¹ã©ã€ã¹ã¿ã€ã倿°ã«é¢é£ä»ããããã¹ã©ã€ã¹ããããŒãããããã®ããããŒã¯åå¥ã«å²ãåœãŠãããé
åã®äžéšã瀺ããŸããã¹ã©ã€ã¹ãäœæãããšãããããŒãã³ããŒãããŸãããé
åã¯åžžã«åå²ãããŸããäœæ¥ãè©äŸ¡ããåŸãã¹ã©ã€ã¹ã¯äœ¿ãããããªãã ãã§ãªããç¹ã«çµã¿èŸŒã¿ã®ã³ããŒããã³è¿œå æ©èœã«ããã匷åã§è¡šçŸåè±ãã«ãªããŸãã
ãªãªãžãã«ã®åºçç©-blog.golang.org/slices