GoãŠã©ãŒã¯ã¹ã«ãŒã·ãªãŒãºã®Ben Johnsonã®èšäºã®1ã€ã翻蚳ããŠãå®äžçã®ã¿ã¹ã¯ã®ã³ã³ããã¹ãã§ã®Goæšæºã©ã€ãã©ãªã®ãã詳现ãªç ç©¶ãè¡ããŸãã
以åã®æçš¿ã§ããã€ãã¹ããªãŒã ã®æäœæ¹æ³ãèŠã€ããŸããããã¡ã¢ãªå
ã®ç¹å®ã®ãã€ãã»ãããæäœããå¿
èŠãããå ŽåããããŸãã ãã€ãã¹ã©ã€ã¹ã¯å€ãã®ã¿ã¹ã¯ã«éåžžã«é©ããŠããŸããã bytesããã±ãŒãžã䜿çšããã»ããããå Žåãå€ããããŸãã ãŸãã仿¥ã®æååããã±ãŒãžãèŠãŠãããŸããAPIã¯ãã€ããšã»ãŒåãã§ã æååã§ã®ã¿æ©èœããããã§ãã
ãã®æçš¿ã¯ãæšæºã©ã€ãã©ãªã®ãã詳现ãªåæã«é¢ããäžé£ã®èšäºã®1ã€ã§ãã æšæºããã¥ã¡ã³ãã¯å€ãã®æçšãªæ
å ±ãæäŸãããšããäºå®ã«ãããããããå®éã®ã¿ã¹ã¯ã®ã³ã³ããã¹ãã§ã¯ãäœããã€äœ¿çšããããææ¡ããã®ãé£ããå ŽåããããŸãã ãã®äžé£ã®èšäºã¯ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ãã§ã®æšæºã©ã€ãã©ãªããã±ãŒãžã®äœ¿çšã瀺ãããšãç®çãšããŠããŸãã 質åãã³ã¡ã³ããããã°ããã€ã§ãTwitter-@benbjohnsonã§ç§ãæžãããšãã§ããŸãã
æååãšãã€ãã«é¢ããç°¡åãªäœè«
Rob Pikeã¯ã æååããã€ããã«ãŒã³ãããã³æåã«é¢ããåªããè©³çŽ°ãªæçš¿ãæžããŸãããããã®æçš¿ã§ã¯ãéçºè
ã®èгç¹ããããåçŽãªå®çŸ©ãæäŸããããšæããŸãã
ã¹ã©ã€ã¹ãã€ãã¯ããã€ãã®å¯å€ã·ãŒã±ã³ã·ã£ã«ã»ããã§ãã å°ãåé·ãªã®ã§ããããäœãæå³ããã®ããçè§£ããŠã¿ãŸãããã
ãã€ãã¹ã©ã€ã¹ããããŸãã
buf := []byte{1,2,3,4}
å¯å€ãªã®ã§ããã®äžã®èŠçŽ ã倿Žã§ããŸãïŒ
buf[3] = 5
ãµã€ãºã倿Žããããšãã§ããŸãïŒ
buf = buf[:2]
ãŸããã¡ã¢ãªå
ã®ãã€ããæ¬¡ã
ãšç§»åãããããã·ãŒã±ã³ã·ã£ã«ã§ãã
1|2|3|4
äžæ¹ ãæååã¯åºå®ãµã€ãºã®ãã€ãã®äžå€ã®é£ç¶ã»ããã§ãã ã€ãŸããè¡ã倿Žããããšã¯ã§ããŸãã-æ°ããè¡ã®ã¿ãäœæããŠãã ããã ããã¯ãããã°ã©ã ã®ããã©ãŒãã³ã¹ã®ã³ã³ããã¹ãã§çè§£ããããšãéèŠã§ãã éåžžã«é«ãããã©ãŒãã³ã¹ãå¿
èŠãªããã°ã©ã ã§ã¯ã倿°ã®è¡ãçµ¶ããäœæãããšãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«é¡èãªè² è·ãããããŸãã
éçºè
ã®èгç¹ãããæååã¯UTF-8ã§ããŒã¿ãæäœãããšãã«æé©ã«äœ¿çšãããŸããããšãã°ããã€ãã¹ã©ã€ã¹ãšã¯ç°ãªãããããã®ããŒãšããŠäœ¿çšã§ããŸãããŸããã»ãšãã©ã®APIã¯æååããŒã¿ã衚ãããã«æååã䜿çšããŸãã äžæ¹ããã€ãã¹ã©ã€ã¹ã¯ãããšãã°ããŒã¿ã¹ããªãŒã ãåŠçãããšãã«çã®ãã€ãã䜿çšããå¿
èŠãããå Žåã«é©ããŠããŸãã ãŸããæ°ããã¡ã¢ãªå²ãåœãŠãé¿ããã¡ã¢ãªãåå©çšããå Žåã«ã䟿å©ã§ãã
ã¹ããªãŒã ã®æååãšã¹ã©ã€ã¹ã®èª¿æŽ
ãã€ãããã³æååããã±ãŒãžã®æãéèŠãªæ©èœã®1ã€ã¯ãã¡ã¢ãªå
ã®ãã€ãããã³æååãæäœããããã®io.Readerããã³io.Writerã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããããšã§ãã
ã€ã³ã¡ã¢ãªãŒãªãŒããŒ
Goæšæºã©ã€ãã©ãªã§äœ¿çšãããŠããªã2ã€ã®é¢æ°ã¯ã bytes.NewReaderãšstrings.NewReaderã§ãã
func NewReader(b []byte) *Reader func NewReader(s string) *Reader
ãããã®é¢æ°ã¯ãã¡ã¢ãªå
ã®ãã€ãã¹ã©ã€ã¹ãŸãã¯æååã®ã©ãããŒãšããŠæ©èœããio.Readerã€ã³ã¿ãŒãã§ãŒã¹å®è£
ãè¿ããŸãã ãã ãããããã¯ãªãŒããŒã ãã§ã¯ãããŸãã-io.ReaderAt ã io.WriterTo ã io.ByteReader ã io.ByteScanner ã io.RuneReader ã io.RuneScanner ã io.Seekerãªã©ãä»ã®é¢é£ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŸãã
ãã€ãã¹ã©ã€ã¹ãšè¡ãæåã«bytes.Bufferã«æžã蟌ãŸããæ¬¡ã«ãããã¡ãŒããªãŒããŒãšããŠäœ¿çšãããã³ãŒãã宿çã«ç¢ºèªããŸãã
var buf bytes.Buffer buf.WriteString("foo") http.Post("http://example.com/", "text/plain", &buf)
ãã®ã¢ãããŒãã§ã¯è¿œå ã®ã¡ã¢ãªå²ãåœãŠãå¿
èŠã§ãããæéããããå ŽåããããŸãã string.Readerã䜿çšããæ¹ãã¯ããã«å¹ççã§ãã
r := strings.NewReader("foobar") http.Post("http://example.com", "text/plain", r)
ãã®ã¡ãœããã¯ã[io.MultiReader]ïŒïŒã䜿çšããŠçµã¿åãããããšãã§ããå€ãã®è¡ãŸãã¯ãã€ãã¹ã©ã€ã¹ãããå Žåã«ãæ©èœããŸãã
r := io.MultiReader( strings.NewReader("HEADER"), bytes.NewReader([]byte{0,1,2,3,4}), myFile, strings.NewReader("FOOTER"), )
ã€ã³ã¡ã¢ãªãŒã©ã€ã¿ãŒ
bytesããã±ãŒãžã¯ã Bufferã¿ã€ãã䜿çšããŠã¡ã¢ãªå
ã®ãã€ãã¹ã©ã€ã¹çšã®io.Writerã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããŸãã io.Closerãšio.Seekerãé€ãã ioããã±ãŒãžã®ã»ãŒãã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããŸãã ãŸãããããã¡ã®æåŸã«è¡ãæžã蟌ãããã®ãã«ããŒã¡ãœããWriteStringïŒïŒããããŸãã
ãŠããããã¹ãã§ãããã¡ãç©æ¥µçã«äœ¿çšããŠããµãŒãã¹ãã°ã®åºåããã£ããã£ããŸãã log.NewïŒïŒã®åŒæ°ãšããŠãããã¡ãæž¡ããåŸã§åºåã確èªã§ããŸãã
var buf bytes.Buffer myService.Logger = log.New(&buf, "", log.LstdFlags) myService.Run() if !strings.Contains(buf.String(), "service failed") { t.Fatal("expected log message") }
ããããéç£ã³ãŒãã§ã¯ãç§ã¯ãã£ãã«Bufferã䜿çšããŸããã ååã«ããããããããããã¡ãªã³ã°ãããèªã¿åããšæžã蟌ã¿ã«ã¯äœ¿çšããŸãããããã¯ãæšæºã©ã€ãã©ãªã«ããå°çšã®bufioããã±ãŒãžãããããã§ãã
ããã±ãŒãžæ§æ
äžèŠãããšããã€ããšæååã®ããã±ãŒãžã¯éåžžã«å€§ããããã«èŠããŸãããå®éã«ã¯åçŽãªãã«ããŒé¢æ°ã®ã³ã¬ã¯ã·ã§ã³ã«ãããŸããã ããããããã€ãã®ã«ããŽãªã«ã°ã«ãŒãåã§ããŸãã
- æ¯èŒé¢æ°
- æ€èšŒé¢æ°
- ãã¬ãã£ãã¯ã¹/ãµãã£ãã¯ã¹é¢æ°
- çœ®ææ©èœ
- çµåããã³åé¢é¢æ°
ãããã®é¢æ°ãã©ã®ããã«ã°ã«ãŒãåãããŠããããçè§£ãããšãäžèŠå€§ããªAPIãã¯ããã«å¿«é©ã«èŠããŸãã
æ¯èŒé¢æ°
2ã€ã®ãã€ãã¹ã©ã€ã¹ãŸãã¯2è¡ãããå Žåã2ã€ã®è³ªåã«å¯ŸããçããååŸããå¿
èŠãããå ŽåããããŸãã ãŸããããã2ã€ã®ãªããžã§ã¯ãã¯çããã§ããïŒ ãããŠ2çªç®-ãœãŒãããåã«ã©ã®ãªããžã§ã¯ããæ¥ãŸããïŒ
å¹³ç
EqualïŒïŒé¢æ°ã¯æåã®è³ªåã«çããŸãïŒ
func Equal(a, b []byte) bool
æååã¯==æŒç®åã䜿çšããŠæ¯èŒã§ããããããã®é¢æ°ã¯bytesããã±ãŒãžã§ã®ã¿äœ¿çšã§ããŸãã
åçæ§ã®ãã§ãã¯ã¯åçŽãªã¿ã¹ã¯ã®ããã«æãããããããŸãããã strings.ToUpperïŒïŒã䜿çšããŠå€§æåãšå°æåãåºå¥ããªãåçæ§ããã§ãã¯ããå Žåã«ããããééãããããŸãã
if strings.ToUpper(a) == strings.ToUpper(b) { return true }
ãã®ã¢ãããŒãã¯ééã£ãŠããŸããæ°ããè¡ã«2ã€ã®å²ãåœãŠã䜿çšããŸãã ãã£ãšæ£ç¢ºãªã¢ãããŒãã¯EqualFoldïŒïŒã䜿çšããããšã§ã ïŒ
func EqualFold(s, t []byte) bool func EqualFold(s, t string) bool
ããã§ãããæãç³ã¿ããšããèšèã¯ã Unicodeã®å€§æåãšå°æåã®åºå¥ãæå³ããŸã ã AZã ãã§ãªããä»ã®èšèªã®å€§æåãšå°æåã®èŠåãã«ããŒããÏãtoã«å€æã§ããŸãã
æ¯èŒ
ãã€ããŸãã¯ã¹ããªã³ã°ã®2ã€ã®ã¹ã©ã€ã¹ããœãŒãããé åºãèŠã€ããããã«ã CompareïŒïŒé¢æ°ããããŸãã
func Compare(a, b []byte) int func Compare(a, b string) int
ãã®é¢æ°ã¯ãaãbããå°ããå Žåã¯-1ãaãbãã倧ããå Žåã¯1ãaãšbãçããå Žåã¯0ãè¿ããŸãã ãã®é¢æ°ã¯ããã€ããšã®å¯Ÿç§°æ§ã®ããã ãã«æååããã±ãŒãžã«å«ãŸããŠããŸãã ã©ã¹ã³ãã¯ã¹ã¯ã 誰ãstrings.Compareã䜿çšãã¹ãã§ã¯ãªã ããšããåŒã³ãããŠããŸãã çµã¿èŸŒã¿ã®æŒç®å<and>ã䜿çšããæ¹ãç°¡åã§ãã
ã誰ãstrings.Compareã䜿ãã¹ãã§ã¯ãªãããã©ã¹ã»ã³ãã¯ã¹
éåžžãããŒã¿ãäžŠã¹æ¿ãããšãã¯ããã€ããŸãã¯æååã®ã¹ã©ã€ã¹ãæ¯èŒããå¿
èŠããããŸãã sort.Interfaceã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯ãLessïŒïŒã¡ãœããã®æ¯èŒé¢æ°ãå¿
èŠã§ãã CompareïŒïŒã®æ»ãå€ã®3é²åœ¢åŒãLessïŒïŒã®ããŒã«å€ã«å€æããã«ã¯ã-1ãšã®ç䟡æ§ããã§ãã¯ããŸãã
type ByteSlices [][]byte func (p ByteSlices) Less(i, j int) bool { return bytes.Compare(p[i], p[j]) == -1 }
æ€èšŒé¢æ°
ãã€ãããã³æååããã±ãŒãžã¯ãæååãŸãã¯ãã€ãã¹ã©ã€ã¹ã®å€ããã§ãã¯ãŸãã¯æ€çŽ¢ããããã®ããã€ãã®æ¹æ³ãæäŸããŸãã
ã«ãŠã³ã
å
¥åãæ€èšŒããå Žåããããã®ç¹å®ã®ãã€ãã®ååšïŒãŸãã¯äžåšïŒã確èªããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã ContainsïŒïŒé¢æ°ã䜿çšã§ããŸãã
func Contains(b, subslice []byte) bool func Contains(s, substr string) bool
ããšãã°ãç¹å®ã®æªãåèªã確èªã§ããŸãã
if strings.Contains(input, "darn") { return errors.New("inappropriate input") }
ç®çã®éšåæååã®æ£ç¢ºãªåºçŸåæ°ãèŠã€ããå¿
èŠãããå Žåã¯ãCountïŒïŒã䜿çšã§ããŸãã
func Count(s, sep []byte) int func Count(s, sep string) int
CountïŒïŒã®ãã1ã€ã®çšéã¯ãæååå
ã®ã«ãŒã³ã®æ°ãã«ãŠã³ãããããšã§ãã sepåŒæ°ãšããŠç©ºã®ã¹ã©ã€ã¹ãŸãã¯ç©ºã®æååãæž¡ããšãCountïŒïŒã¯ã«ãŒã³æ°+ 1ãè¿ããŸããããã¯ããã€ãæ°ãè¿ãlenïŒïŒã®åºåãšã¯ç°ãªããŸãã ãã«ããã€ãUnicodeæåã䜿çšããŠããå Žåããã®éãã¯éèŠã§ãã
strings.Count("I ", "")
å®éã«ã¯5ã€ã®ã«ãŒã³æåããããããæåã®è¡ã¯å¥åŠã«èŠãããããããŸããããCountïŒïŒãã«ãŒã³æåã«1ãå ããæ°ãè¿ãããšãå¿ããªãã§ãã ããã
玢åŒä»ã
ãšã³ããªã®ç¢ºèªã¯éèŠãªã¿ã¹ã¯ã§ããããµãã¹ããªã³ã°ãŸãã¯ç®çã®ã¹ã©ã€ã¹ã®æ£ç¢ºãªäœçœ®ãèŠã€ããå¿
èŠãããå ŽåããããŸãã ããã¯ãã€ã³ããã¯ã¹é¢æ°ã䜿çšããŠå®è¡ã§ããŸãã
Index(s, sep []byte) int IndexAny(s []byte, chars string) int IndexByte(s []byte, c byte) int IndexFunc(s []byte, f func(r rune) bool) int IndexRune(s []byte, r rune) int
ããŸããŸãªã±ãŒã¹ã«å¯Ÿå¿ããæ©èœãããã€ããããŸãã ã€ã³ããã¯ã¹ïŒïŒã¯ãã«ããã€ãã¹ã©ã€ã¹ãæ¢ããŠããŸãã IndexByteïŒïŒã¯ãã¹ã©ã€ã¹å
ã®åäžãã€ããèŠã€ããŸãã IndexRuneïŒïŒã¯ãUTF-8æååã§Unicodeã³ãŒããã€ã³ããæ¢ããŸãã IndexAnyïŒïŒã¯IndexRuneïŒïŒãšåæ§ã«æ©èœããŸãããäžåºŠã«è€æ°ã®ã³ãŒããã€ã³ããæ€çŽ¢ããŸãã çµè«ãšããŠã IndexRuneïŒïŒã䜿çšãããšãç¬èªã®é¢æ°ã䜿çšããŠã€ã³ããã¯ã¹ãæ€çŽ¢ã§ããŸãã
æåŸããæåã®äœçœ®ãèŠã€ããããã®åæ§ã®é¢æ°ã»ããããããŸãã
LastIndex(s, sep []byte) int LastIndexAny(s []byte, chars string) int LastIndexByte(s []byte, c byte) int LastIndexFunc(s []byte, f func(r rune) bool) int
ç§ã¯éåžžãã€ã³ããã¯ã¹äœæé¢æ°ãå°ã䜿çšããŸããããã¯ãããŒãµãŒãªã©ã®ããè€éãªãã®ãäœæããå¿
èŠãããå Žåãå€ãããã§ãã
ãã¬ãã£ãã¯ã¹ããµãã£ãã¯ã¹ãããã³åé€
ããã°ã©ãã³ã°ãã¬ãã£ãã¯ã¹ã¯éåžžã«äžè¬çã§ãã ããšãã°ãHTTPã¢ãã¬ã¹ã®ãã¹ã¯ãå€ãã®å Žåããã¬ãã£ãã¯ã¹ã䜿çšããŠæ©èœããšã«ã°ã«ãŒãåãããŸãã ãŸãã¯ãå¥ã®äŸ-è¡ã®å
é ã«ããã@ããªã©ã®ç¹æ®æåã¯ããŠãŒã¶ãŒãæãããã«äœ¿çšãããŸãã
HasPrefixïŒïŒããã³HasSuffixïŒïŒé¢æ°ã䜿çšãããšããã®ãããªå Žåã確èªã§ããŸãã
func HasPrefix(s, prefix []byte) bool func HasPrefix(s, prefix string) bool func HasSuffix(s, suffix []byte) bool func HasSuffix(s, suffix string) bool
ãããã®é¢æ°ã¯åçŽããããšæããããããããŸããããéçºè
ãæååã®ãŒããµã€ãºããã§ãã¯ããã®ãå¿ãããšã次ã®ãšã©ãŒã宿çã«è¡šç€ºãããŸãã
if str[0] == '@' { return true }
ãã®ã³ãŒãã¯åçŽã«èŠããŸãããstrãç©ºã®æååã§ããããšã倿ãããšããããã¯ã«ãªããŸãã HasPrefixïŒïŒé¢æ°ã«ã¯æ¬¡ã®ãã§ãã¯ãå«ãŸããŸãã
if strings.HasPrefix(str, "@") { return true }
åé€ãã
ãã€ããšæååã®ãããªãã³ã°ããšããçšèªã¯ãã¹ã©ã€ã¹ãŸãã¯è¡ã®å
é ããã³/ãŸãã¯æ«å°Ÿã®ãã€ããŸãã¯ã«ãŒã³ãåé€ããããšãæå³ããŸãã ãã®ããã«äžè¬åããã颿°èªäœã¯TrimïŒïŒã§ãã
func Trim(s []byte, cutset string) []byte func Trim(s string, cutset string) string
ã©ã€ã³ã®æåãšæåŸãããäž¡åŽã®ã«ããã»ãããããã¹ãŠã®ã«ãŒã³æåãåé€ããŸãã TrimLeftïŒïŒããã³TrimRightïŒïŒããããã䜿çšããŠãå
é ããã®ã¿ããŸãã¯æ«å°Ÿããã®ã¿åé€ããããšãã§ããŸãã
ããããããå€ãã®å Žåãããå
·äœçãªåé€ãªãã·ã§ã³ã䜿çšãããŸã-ã¹ããŒã¹ãåé€ããã«ã¯ã TrimSpaceïŒïŒé¢æ°ããããŸãïŒ
func TrimSpace(s []byte) []byte func TrimSpace(s string) string
ã\ n \ rãã«çããã«ããã»ããã§åé€ããã ãã§ååã§ãããšæããããããããŸããããTrimSpaceïŒïŒã¯Unicodeã§å®çŸ©ãããã¹ããŒã¹æåãåé€ã§ããŸãã ããã«ã¯ãã¹ããŒã¹ãã©ã€ã³ãã£ãŒãããŸãã¯ã¿ãã ãã§ãªãã ã现ãã¹ããŒã¹ããããã¢ã¹ããŒã¹ããªã©ã®éæšæºæåãå«ãŸããŸãã
TrimSpaceïŒïŒã¯å®éã«ã¯ãåé€ã«äœ¿çšãããæåãå®çŸ©ããTrimFuncïŒïŒã®åãªãã©ãããŒã§ãã
func TrimSpace(s string) string { return TrimFunc(s, unicode.IsSpace) }
ãããã£ãŠãè¡ã®æ«å°Ÿã®ã¹ããŒã¹ã®ã¿ãåé€ããç¬èªã®é¢æ°ãéåžžã«ç°¡åã«äœæã§ããŸãã
TrimRightFunc(s, unicode.IsSpace)
çµè«ãšããŠãæåã§ã¯ãªããå·ŠåŽãŸãã¯å³åŽã®ç¹å®ã®éšåæååãåé€ãããå Žåã TrimPrefixïŒïŒããã³TrimSuffixïŒïŒé¢æ°ããããŸãïŒ
func TrimPrefix(s, prefix []byte) []byte func TrimPrefix(s, prefix string) string func TrimSuffix(s, suffix []byte) []byte func TrimSuffix(s, suffix string) string
HasPrefixïŒïŒããã³HasSuffixïŒïŒé¢æ°ãšé£æºã㊠ããããããã¬ãã£ãã¯ã¹ãŸãã¯ãµãã£ãã¯ã¹ã確èªããŸãã ããšãã°ãããŒã ãã£ã¬ã¯ããªã«ããæ§æãã¡ã€ã«ã®ãã¹ãbashã®ããã«è£å®ããããã«äœ¿çšããŸãã
çœ®ææ©èœ
ç°¡åãªäº€æ
å Žåã«ãã£ãŠã¯ãéšåæååãŸãã¯ã¹ã©ã€ã¹ã®äžéšã眮ãæããå¿
èŠããããŸãã æãåçŽãªå Žåãå¿
èŠãªã®ã¯ReplaceïŒïŒé¢æ°ã ãã§ãã
func Replace(s, old, new []byte, n int) []byte func Replace(s, old, new string, n int) string
ããã¯ãæååå
ã®å€ããã®ãæ°ãããã®ã«çœ®ãæããŸãã nã-1ã®å Žåããã¹ãŠã®åºçŸã眮ãæããããŸãã ãã®é¢æ°ã¯ãåçŽãªåèªããã¿ãŒã³ã«çœ®ãæããå¿
èŠãããå Žåã«éåžžã«é©ããŠããŸãã ããšãã°ããŠãŒã¶ãŒã«$ NOWãã¿ãŒã³ã®äœ¿çšãèš±å¯ãããããçŸåšã®æå»ã«çœ®ãæããããšãã§ããŸãã
now := time.Now().Format(time.Kitchen) println(strings.Replace(data, "$NOW", now, -1)
è€æ°ã®ç°ãªããªã«ã¬ã³ã¹ãäžåºŠã«çœ®æããå¿
èŠãããå Žåã¯ã strings.Replacerã䜿çšããŸãã å
¥åãšããŠå€ã/æ°ããå€ãåããŸãïŒ
r := strings.NewReplacer("$NOW", now, "$USER", "mary") println(r.Replace("Hello $USER, it is $NOW"))
ã±ãŒã¹äº€æ
ã¬ãžã¹ã¿ãæäœããã®ã¯ç°¡åã ãšæããããããŸãããïŒäžãšäžãããžãã¹ã ãïŒãGoã¯Unicodeã§åäœããUnicodeã¯æ±ºããŠåçŽã§ã¯ãããŸããã ã¬ãžã¹ã¿ã«ã¯ã倧æåãå°æåã倧æåã®3ã€ã®ã¿ã€ãããããŸãã
äžéšãšäžéšã¯ã»ãšãã©ã®èšèªã§éåžžã«ã·ã³ãã«ã§ã ToUpperïŒïŒããã³ToLowerïŒïŒé¢æ°ã䜿çšããã ãã§ãã
func ToUpper(s []byte) []byte func ToUpper(s string) string func ToLower(s []byte) []byte func ToLower(s string) string
ãã ããäžéšã®èšèªã§ã¯ãã¬ãžã¹ã¿ã®èŠåãäžè¬ã«åãå
¥ããããŠããèŠåãšç°ãªããŸãã ããšãã°ããã«ã³èªã§ã¯ã倧æåã®iã¯Ä°ã®ããã«ãªããŸãã ãã®ãããªç¹å¥ãªå Žåã®ããã«ããããã®é¢æ°ã®ç¹å¥ãªããŒãžã§ã³ããããŸãïŒ
strings.ToUpperSpecial(unicode.TurkishCase, "i")
ããã«ãè³æ¬ç»é²ç°¿ãšToTitleïŒïŒé¢æ°ããŸã ãããŸãã
func ToTitle(s []byte) []byte func ToTitle(s string) string
ToTitleïŒïŒããã¹ãŠã®æåã倧æåã«å€æããã®ãèŠããšãããããéåžžã«é©ãã§ãããïŒ
println(strings.ToTitle("the count of monte cristo"))
ããã¯ããŠãã³ãŒãã§ã¯å€§æåãç¹æ®ãªã±ãŒã¹ã§ããã倧æåã®åèªã®æåã®æåã§ã¯ãªãããã§ãã ã»ãšãã©ã®å Žåã倧æåãšå€§æåã¯åãã§ãããããã§ã¯ãªãã³ãŒããã€ã³ããããã€ããããŸãã ããšãã°ã 倧æåã®ã³ãŒããã€ã³ãÇ ïŒã¯ããããã¯1ã€ã®ã³ãŒããã€ã³ãã§ãïŒã¯likeã®ããã«èŠãã倧æåã®å Žåã¯-Çã§ãã
ãã®å Žåã«å¿
èŠãªé¢æ°ã¯ãããããTitleïŒïŒã§ãã
func Title(s []byte) []byte func Title(s string) string
圌女ã®çµè«ã¯ãã£ãšçå®ã«äŒŒãŠããã ããïŒ
println(strings.Title("the count of monte cristo"))
ã«ãŒã³ã®ãããã³ã°
ãã€ãã¹ã©ã€ã¹ãšæååã®ããŒã¿ã眮ãæããå¥ã®æ¹æ³ããããŸã-Map ïŒïŒé¢æ°ïŒ
func Map(mapping func(r rune) rune, s []byte) []byte func Map(mapping func(r rune) rune, s string) string
ãã®é¢æ°ã䜿çšãããšãåã«ãŒã³ããã§ãã¯ããã³çœ®æãã颿°ãæå®ã§ããŸãã æ£çŽã«èšããšããã®æçš¿ã®å·çãéå§ãããŸã§ãã®æ©èœã«ã€ããŠã¯ç¥ããŸããã§ããã®ã§ãããã§å人çãªäœ¿çšå±¥æŽã説æããããšã¯ã§ããŸããã
çµåããã³åé¢é¢æ°
å€ãã®å Žåãæååãåå²ããå¿
èŠãããåºåãæåãå«ãæååãæäœããå¿
èŠããããŸãã ããšãã°ãUNIXãã¹ã¯ã³ãã³ã§åºåãããŠãããCSV圢åŒã¯åºæ¬çã«ã«ã³ãã§åºåãããããŒã¿ã§ãã
æ¹è¡
ã¹ã©ã€ã¹ãŸãã¯ãµãã¹ããªã³ã°ã®åçŽãªåå²ã®ããã«ãSplitïŒïŒ-颿°ããããŸãïŒ
func Split(s, sep []byte) [][]byte func SplitAfter(s, sep []byte) [][]byte func SplitAfterN(s, sep []byte, n int) [][]byte func SplitN(s, sep []byte, n int) [][]byte func Split(s, sep string) []string func SplitAfter(s, sep string) []string func SplitAfterN(s, sep string, n int) []string func SplitN(s, sep string, n int) []string
ãããã®é¢æ°ã¯ãåºåãæåã«åŸã£ãŠæååãŸãã¯ã¹ã©ã€ã¹ãã€ããåå²ããè€æ°ã®ã¹ã©ã€ã¹ãŸãã¯ãµãã¹ããªã³ã°ãšããŠè¿ããŸãã AfterïŒïŒ-颿°ã¯ãµãã¹ããªã³ã°ã«ã»ãã¬ãŒã¿ãŒèªäœãå«ããNïŒïŒ-颿°ã¯è¿ãããããŒãã£ã·ã§ã³ã®æ°ãå¶éããŸãïŒ
strings.Split("a:b:c", ":")
è¡ã®åå²ã¯éåžžã«äžè¬çãªæäœã§ãããããã¯éåžžãCSVãŸãã¯UNIXãã¹ã®åœ¢åŒã®ãã¡ã€ã«ãæäœããã³ã³ããã¹ãã§çºçããŸãã ãã®ãããªå Žåã ãšã³ã³ãŒãã£ã³ã°/ csvããã³ãã¹ããã±ãŒãžããããã䜿çšããŸãã
åé¡
å Žåã«ãã£ãŠã¯ãäžé£ã®ã«ãŒã³ã§ã¯ãªãã«ãŒã³ã®ã»ãããšããŠã»ãã¬ãŒã¿ãŒãæå®ããå¿
èŠããããŸãã ããã§ã®æè¯ã®äŸã¯ãåèªãç°ãªãé·ãã®ã¹ããŒã¹ã«åå²ããããšã§ãã åºåãæåãšããŠã¹ããŒã¹ã䜿çšããŠSplitïŒïŒãåŒã³åºãã ãã§ãå
¥åã®è¡ã«è€æ°ã®ã¹ããŒã¹ãããå Žåãåºåã«ç©ºã®ãµãã¹ããªã³ã°ã衚瀺ãããŸãã 代ããã«ã FieldsïŒïŒé¢æ°ã䜿çšããŸãã
func Fields(s []byte) [][]byte
é£ç¶ããã¹ããŒã¹ã1ã€ã®åºåãæåãšããŠæ±ããŸãã
strings.Fields("hello world")
FieldsïŒïŒé¢æ°ã¯ãå¥ã®é¢æ°-FieldsFuncïŒïŒã®åçŽãªã©ãããŒã§ããããã«ãããä»»æã®é¢æ°ãæå®ããŠãã«ãŒã³æåã®åºåãã確èªã§ããŸãã
func FieldsFunc(s []byte, f func(rune) bool) [][]byte
è¡é£çµ
ããŒã¿ãæäœãããšãã«ãã䜿çšãããå¥ã®æäœã¯ãã¹ã©ã€ã¹ãšã©ã€ã³ã®çµåã§ãã ããã«ã¯JoinïŒïŒé¢æ°ããããŸãïŒ
func Join(s [][]byte, sep []byte) []byte func Join(a []string, sep string) string
ç§ãééãããšã©ãŒã®1ã€ã¯ãéçºè
ãæååã®é£çµãæåã§å®è£
ããæ¬¡ã®ããã«èšè¿°ããããšããŠããããšã§ãã
var output string for i, s := range a { output += s if i < len(a) - 1 { output += "," } } return output
ãã®ã³ãŒãã®åé¡ã¯ãå€ãã®ã¡ã¢ãªå²ãåœãŠãããããšã§ãã è¡ã¯äžå€ãªã®ã§ãå埩ããšã«æ°ããè¡ãäœæãããŸãã strings.JoinïŒïŒé¢æ°ã¯ããã€ãã®ã¹ã©ã€ã¹ããããã¡ãŒãšããŠäœ¿çšããæåŸã«ãããã¹ããªã³ã°ã«å€æããŸãã ããã«ãããã¡ã¢ãªå²ãåœãŠã®æ°ãæå°éã«æããããŸãã
ãã®ä»ã®æ©èœ
ã©ã®ã«ããŽãªã«ãæç¢ºã«é¢é£ä»ããããšãã§ããªãã£ã2ã€ã®é¢æ°ãããããã以äžã«ç€ºããŸãã ãŸãã RepeatïŒïŒé¢æ°ã䜿çšãããšãç¹°ãè¿ãèŠçŽ ã®æååãäœæã§ããŸãã æ£çŽãªãšãããç§ã䜿ã£ãã®ã¯ãã¿ãŒããã«ã®åºåãåé¢ããè¡ãäœæããããšã ãã§ãã
println(strings.Repeat("-", 80))
å¥ã®é¢æ°RunesïŒïŒã¯ã UTF-8ãšããŠè§£éãããæååãŸãã¯ãã€ãã¹ã©ã€ã¹ã®ã«ãŒã³ã¹ã©ã€ã¹ãè¿ããŸãã è¡ã®forã«ãŒãã¯ãäžèŠãªå²ãåœãŠãªãã§ãŸã£ããåãããšãè¡ãããããã®é¢æ°ã䜿çšããããšã¯ãããŸããã
ãããã«
ãã€ãã¹ã©ã€ã¹ãšæååã¯ãGoã®åºæ¬çãªããªããã£ãã§ãã ãããã¯ãã¡ã¢ãªå
ã®ãã€ããŸãã¯ã«ãŒã³ã®è¡šçŸã§ãã ãã€ãããã³æååããã±ãŒãžã¯ãio.Readerããã³io.Writerã€ã³ã¿ãŒãã§ãŒã¹çšã®ã¢ããã¿ãŒãšåæ§ã«ã倿°ã®è£å©æ©èœãæäŸããŸãã
ãããã®ããã±ãŒãžã®APIãµã€ãºã倧ããããããããã®äŸ¿å©ãªæ©èœã®å€ããèŠèœãšãã®ã¯éåžžã«ç°¡åã§ããããã®æçš¿ããããã®ããã±ãŒãžãçè§£ããããããæäŸããæ©èœã«ã€ããŠåŠã¶ã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã