Go Walkthroughã·ãªãŒãºã®Ben Johnsonã®èšäºã®1ã€ã翻蚳ããŠãå®äžçã®ã¿ã¹ã¯ã®ã³ã³ããã¹ãã§ã®æšæºã©ã€ãã©ãªã®ãã詳现ãªç ç©¶ãè¡ããŸãã
Goã¯ããã€ããæ±ãã®ã«é©ããããã°ã©ãã³ã°èšèªã§ãã ãã€ãã®ãªã¹ãããã€ãã®ã¹ããªãŒã ããŸãã¯åäžã®ãã€ãã®ãããã䜿çšããå Žåã§ããGoã¯ç°¡åã«æäœã§ããŸãã ãããã¯ãæœè±¡åãšãµãŒãã¹ãæ§ç¯ããããªããã£ãã§ãã
ioããã±ãŒãžã¯ãæšæºã©ã€ãã©ãªå
šäœã§æãåºæ¬çãªãã®ã®1ã€ã§ãã ãã€ãã¹ããªãŒã ãæäœããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãšãã«ããŒé¢æ°ã®ã»ãããæäŸããŸãã
ãã®æçš¿ã¯ãæšæºã©ã€ãã©ãªã®ãã詳现ãªåæã«é¢ããäžé£ã®èšäºã®1ã€ã§ãã æšæºããã¥ã¡ã³ãã¯å€ãã®æçšãªæ
å ±ãæäŸãããšããäºå®ã«ãããããããå®éã®ã¿ã¹ã¯ã®ã³ã³ããã¹ãã§ã¯ãäœããã€äœ¿çšããããææ¡ããã®ãé£ããå ŽåããããŸãã ãã®äžé£ã®èšäºã¯ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ãã§ã®æšæºã©ã€ãã©ãªããã±ãŒãžã®äœ¿çšã瀺ãããšãç®çãšããŠããŸãã
ãã€ãã®èªã¿åã
ãã€ãã䜿çšããå Žåãèªã¿åããšæžã蟌ã¿ã®2ã€ã®åºæ¬çãªæäœããããŸãã æåã«ãã€ãã®èªã¿åããèŠãŠã¿ãŸãããã
ãªãŒããŒã€ã³ã¿ãŒãã§ãŒã¹
ã¹ããªãŒã ãããã€ããèªã¿åãããã®æãç°¡åãªæ§æã¯ã Readerã€ã³ã¿ãŒãã§ã€ã¹ã§ãã
type Reader interface { Read(p []byte) (n int, err error) }
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã ãããã¯ãŒã¯æ¥ç¶ãããã¡ã€ã« ãã¡ã¢ãªå
ã®ã¹ã©ã€ã¹ã®ã©ãããŒãŸã§ããã¹ãŠã®æšæºã©ã€ãã©ãªã«ç¹°ãè¿ãå®è£
ãããŸã ã
Readerã¯ããããã¡ïŒpïŒãReadïŒïŒã¡ãœããã®åŒæ°ãšããŠäœ¿çšãããããã¡ã¢ãªãå²ãåœãŠãå¿
èŠã¯ãããŸããã ReadïŒïŒãåŒæ°ãšããŠåãå
¥ãã代ããã«ãæ°ããã¹ã©ã€ã¹ãè¿ããå ŽåããªãŒããŒã¯ReadïŒïŒãåŒã³åºããããã³ã«ã¡ã¢ãªãå²ãåœãŠãå¿
èŠããããŸãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãšã£ãŠã¯çœå®³ã«ãªããŸãã
Readerã€ã³ã¿ãŒãã§ãŒã¹ã®åé¡ã®1ã€ã¯ãããªãè¯ãããªã«ãŒã«ã®ã»ãããä»å±ããŠããããšã§ãã ãŸããéåžžã®ããžãã¹ã³ãŒã¹ã§ã¯ãããŒã¿ã¹ããªãŒã ãçµäºããå Žåã«io.EOFãšã©ãŒãè¿ããŸãã ããã¯åå¿è
ãæ··ä¹±ãããå¯èœæ§ããããŸãã 第äºã«ããããã¡ããã£ã±ãã«ãªãä¿èšŒã¯ãããŸããã 8ãã€ãã®ã¹ã©ã€ã¹ãéä¿¡ããå Žåãå®éã«ã¯0ã8ãã€ããèªã¿åãããšãã§ããŸãã éšåçãªèªã¿åãåŠçã¯è€éã§ãšã©ãŒãçºçãããããªããŸãã 幞ããªããšã«ããããã®åé¡ã解決ããããã®å€ãã®è£å©æ©èœããããŸãã
èªæžã®ä¿èšŒãæ¹åãã
è§£æããå¿
èŠããããããã³ã«ãããããªãŒããŒãã8ãã€ãã®uint64å€ãèªã¿åããããšããŸãã ãã®å Žåãio.ReadFullïŒïŒã䜿çšããããšããå§ãããŸããèªã¿ããéãæ£ç¢ºã«ç¥ã£ãŠããããã§ãã
func ReadFull(r Reader, buf []byte) (n int, err error)
ãã®é¢æ°ã¯ãå€ãè¿ãåã«ãããã¡ããã£ã±ãã§ããããšã確èªããŸãã åä¿¡ããããŒã¿ã®ãµã€ãºããããã¡ã®ãµã€ãºãšç°ãªãå Žåãio.ErrUnexpectedEOFãšã©ãŒãåãåããŸãã ãã®åçŽãªä¿èšŒã«ãããã³ãŒããããªãç°¡çŽ åãããŸãã 8ãã€ããèªã¿åãã«ã¯ã次ã®ããã«ããŸãã
buf := make([]byte, 8) if _, err := io.ReadFull(r, buf); err != nil { return err }
ç¹å®ã®ã¿ã€ããè§£æã§ããbinary.ReadïŒïŒã®ãããªé«ã¬ãã«ã®ããŒãµãŒãããªããããŸãã ä»ã®ããã±ãŒãžã«é¢ããæ¬¡ã®æçš¿ã§ããããã«ã€ããŠè©³ããç¥ãããšã«ããŸãã
ããŸãäžè¬çã«äœ¿çšãããªãå¥ã®ãã«ããŒé¢æ°ã¯ã ReadAtLeastïŒïŒã§ãã
func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
ãã®é¢æ°ã¯ãèªã¿åãå¯èœãªããŒã¿ããããã¡ãŒã«æžã蟌ã¿ãŸãããæå®ãããã€ãæ°ä»¥äžãæžã蟌ã¿ãŸãã ç§ã¯èªåã§ãã®é¢æ°ãå¿
èŠã ãšã¯æããŸããã§ããããReadïŒïŒåŒã³åºãã®åæ°ãæžãããŠè¿œå ããŒã¿ããããã¡ãªã³ã°ãããå Žåã®å©ç¹ãç°¡åã«æ³åã§ããŸãã
ã¹ã¬ããããŒãªã³ã°
å€ãã®å Žåãè€æ°ã®ãªãŒããŒãäžç·ã«çµã¿åãããå¿
èŠãããç¶æ³ã«å¯Ÿå¿ã§ããŸãã ããã¯MultiReaderã䜿çšãããšç°¡åã§ã ã
func MultiReader(readers ...Reader) Reader
ããšãã°ãããããŒãã¡ã¢ãªããèªã¿åãããå¿çæ¬æã®å
容ããã¡ã€ã«ããèªã¿åãããHTTPå¿çãéä¿¡ãããšããŸãã å€ãã®äººã¯ãéä¿¡ããåã«æåã«ãã¡ã€ã«ãã¡ã¢ãªå
ã®ãããã¡ã«èªã¿èŸŒã¿ãŸãããããã¯é
ãã倧éã®ã¡ã¢ãªãå¿
èŠãšããå ŽåããããŸãã
ããç°¡åãªã¢ãããŒããæ¬¡ã«ç€ºããŸãã
r := io.MultiReader( bytes.NewReader([]byte("...my header...")), myFile, ) http.Post("http://example.com", "application/octet-stream", r)
MultiReaderã䜿çšãããšã http.PostïŒïŒã§äž¡æ¹ã®ãªãŒããŒã1ã€ãšããŠäœ¿çšã§ããŸãã
ã¹ããªãŒã è€è£œ
ãªãŒããŒã§äœæ¥ãããšãã«ééããå¯èœæ§ã®ããããšã®1ã€ã¯ãããŒã¿ãèªã¿åãããå Žåãåã³èªã¿åãããšãã§ããªãããšã§ãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã¯HTTPãªã¯ãšã¹ãã®æ¬æãè§£æã§ããŸããã§ããããè§£æããããšã¯ã§ããŸãããããŒãµãŒã¯ãã§ã«ããŒã¿ãèªã¿èŸŒãã§ããããªãŒããŒã«ãªãããã§ãã
TeeReaderã¯ããã§ã®åªãããœãªã¥ãŒã·ã§ã³ã§ããèªã¿åãããã»ã¹ã劚ããããšãªããèªã¿åãããŒã¿ãä¿åã§ããŸãã
func TeeReader(r Reader, w Writer) Reader
ãã®é¢æ°ã¯ããªãŒããŒrã®æ°ãããªãŒããŒã©ãããŒãäœæããŸãã æ°ãããªãŒããŒããã®èªã¿åãæäœããwã«ããŒã¿ãæžã蟌ã¿ãŸãã ãã®ã©ã€ã¿ã¯ãã¡ã¢ãªå
ã®ãããã¡ãããã°ãã¡ã€ã«ãæšæºSTDERRãšã©ãŒã®ã¹ããªãŒã ãŸã§ãäœã§ãããŸããŸããã
ããšãã°ã次ã®ããã«ããŠãšã©ãŒã®ãããªã¯ãšã¹ãããã£ããã£ã§ããŸãã
var buf bytes.Buffer body := io.TeeReader(req.Body, &buf)
ãã ããã¡ã¢ãªã䜿ãæãããªãããã«ãå·®ãåŒãããå¿çæ¬æã®ãµã€ãºã«æ³šæããããšãéèŠã§ãã
ãããŒé·ã®å¶é
ã¹ããªãŒã ã®ãµã€ãºã¯æ±ºããŠå¶éãããŠããªããããã¹ããªãŒã ããèªã¿åããšãã¡ã¢ãªãŸãã¯ãã£ã¹ã¯å®¹éã«åé¡ãçããå ŽåããããŸãã å
žåçãªäŸã¯ããã¡ã€ã«ã¢ããããŒããã³ãã©ã§ãã éåžžãããŠã³ããŒããããã¡ã€ã«ã®æå€§ãµã€ãºã«ã¯ãã£ã¹ã¯ããªãŒããŒãããŒãããªãããã«å¶éããããŸãããæåã§å®è£
ããã®ã¯é¢åã§ãã
LimitReaderã¯ããªãŒããŒã®ã©ãããŒãæäŸããããšã§ãã®æ©èœãæäŸããæ ¡æ£ã«äœ¿çšã§ãããã€ãæ°ãå¶éããŸãã
func LimitReader(r Reader, n int64) Reader
LimitReaderã䜿çšããããšã®1ã€ã¯ãrãnããå€ãæžç®ãããŠãããã©ãããéç¥ããªãããšã§ãã nãã€ããæžç®ãããšããã«io.EOFãè¿ããŸãã ãŸãã¯ãå¶éãn + 1ã«èšå®ããæåŸã«nãã€ã以äžãèªã¿åããã©ããã確èªã§ããŸãã
ãã€ãã®æžã蟌ã¿
ã¹ããªãŒã ãããã€ããèªã¿åãæ¹æ³ãåŠç¿ããã®ã§ãã¹ããªãŒã ã«ãã€ããæžãèŸŒãæ¹æ³ãèŠãŠã¿ãŸãããã
ã©ã€ã¿ãŒã€ã³ã¿ãŒãã§ã€ã¹
Writerã€ã³ã¿ãŒãã§ã€ã¹ã¯ãæ¬è³ªçã«å転ãªãŒããŒã§ãã ã¹ããªãŒã ã«æžã蟌ãŸããäžé£ã®ãã€ããæå®ããŸãã
type Writer interface { Write(p []byte) (n int, err error) }
äžè¬ã«ããã€ãã®æžã蟌ã¿ã¯èªã¿åããããç°¡åãªæäœã§ãã èªè
ã«ãšã£ãŠãå°é£ãªã®ã¯éšåçãŸãã¯äžå®å
šãªèªã¿åãã§æ£ããåäœããããšã§ãããéšåçãŸãã¯äžå®å
šãªæžã蟌ã¿ã§ã¯ãšã©ãŒãçºçããŸãã
èšé²ã®è€è£œ
æã«ã¯ãäžåºŠã«è€æ°ã®ã©ã€ã¿ãŒã«ããŒã¿ãéä¿¡ããå¿
èŠããããŸãã ããšãã°ããã°ãã¡ã€ã«ãSTDERRã«ãããŸãã ããã¯TeeReaderã«äŒŒãŠããŸãããèªã¿åãã§ã¯ãªããã¬ã³ãŒããè€è£œããã ãã§ãã
ãã®å Žåã MultiWriterãé©ããŠããŸãã
func MultiWriter(writers ...Writer) Writer
ãã®ååã¯ãMultiReaderã®ã©ã€ã¿ãŒããŒãžã§ã³ã§ã¯ãªããããå°ããããã«ãããããããŸããã MultiReaderãè€æ°ã®ãªãŒããŒã1ã€ã«çµåãããšãMultiWriterã¯ã©ã€ã¿ãŒãè¿ããŸããã©ã€ã¿ãŒã¯ãã¹ãŠã®ã©ã€ã¿ãŒã®ãšã³ããªãè€è£œããŸãã
ãŠããããã¹ãã§MultiWriterãç©æ¥µçã«äœ¿çšããŸããããã§ã¯ããµãŒãã¹ããã°ã«æ£ããæžã蟌ãããšã確èªããŸãã
type MyService struct { LogOuput io.Writer } ... var buf bytes.Buffer var s MyService s.LogOutput = io.MultiWriter(&buf, os.Stderr)
MultiWriterã䜿çšãããšãbufã®å
容ã確èªãããšåæã«ããããã°ã®ããã«ã¿ãŒããã«ã§å®å
šãªãã°åºåã確èªã§ããŸãã
ãã€ããã³ããŒ
ãã€ãã®èªã¿åããšæžã蟌ã¿ã®äž¡æ¹ãçè§£ããã®ã§ãããã2ã€ã®æäœãçµã¿åãããŠããããã®éã§ããŒã¿ãã³ããŒããæ¹æ³ãçè§£ããããšã¯çã«ããªã£ãŠããŸãã
ãªãŒããŒãšã©ã€ã¿ãŒã®çµã¿åãã
ãªãŒããŒããã©ã€ã¿ãŒã«ã³ããŒããæãç°¡åãªæ¹æ³ã¯ã CopyïŒïŒé¢æ°ã䜿çšããããšã§ãã
func Copy(dst Writer, src Reader) (written int64, err error)
ãã®é¢æ°ã¯ã32Kãããã¡ãŒã䜿çšããŠsrcããèªã¿åããdstã«æžã蟌ã¿ãŸãã io.EOF以å€ã®ãšã©ãŒãçºçããå Žåãã³ããŒã¯åæ¢ãããšã©ãŒãè¿ãããŸãã
CopyïŒïŒã®åé¡ã®1ã€ã¯ãã³ããŒãããæå€§ãã€ãæ°ãä¿èšŒããæ¹æ³ããªãããšã§ãã ããšãã°ããã°ãã¡ã€ã«ãçŸåšã®ãµã€ãºã«ã³ããŒãããšããŸãã ã³ããŒäžã«ãã°ã倧ãããªãç¶ãããšãäºæ³ããå€ãã®ãã€ããåãåããŸãã ãã®å Žåã CopyNïŒïŒé¢æ°ã䜿çšã§ããŸãããã®é¢æ°ã¯ãæå®ãããæ°ãè¶
ããŠã³ããŒããŸããã
func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
CopyïŒïŒã®ãã1ã€ã®éèŠãªç¹ã¯ãã³ããŒããšã«32Kã®ãããã¡ãŒãå²ãåœãŠãããããšã§ãã å€ãã®ã³ããŒæäœãè¡ãå¿
èŠãããå Žåã¯ãæ¢ã«å²ãåœãŠãããŠãããããã¡ãŒãåå©çšããŠCopyBufferïŒïŒã䜿çšã§ããŸãã
func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)
CopyïŒïŒã®ãªãŒããŒãããã¯å®éã«ã¯éåžžã«å°ãããããå人çã«CopyBufferïŒïŒã䜿çšããŸããã
ã³ããŒãæé©åãã
äžéãããã¡ã®äœ¿çšãåé¿ããããã«ãããŒã¿åã¯ãçŽæ¥èªã¿æžãããããã®ç¹å¥ãªã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ã§ããŸãã åã«å¯ŸããŠå®è£
ãããŠããå ŽåãCopyïŒïŒé¢æ°ã¯ãããã¡ãŒã䜿çšããŸãããããããã®ç¹å¥ãªã¡ãœããã䜿çšããŸãã
åãWriterToã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããå ŽåãããŒã¿ãçŽæ¥æžã蟌ãããšãã§ããŸãã
type WriterTo interface { WriteTo(w Writer) (n int64, err error) }
BoltDB Tx.WriteToïŒïŒé¢æ°ã§äœ¿çšããŸãããããã«ããããŠãŒã¶ãŒã¯ãã©ã³ã¶ã¯ã·ã§ã³ããããŒã¿ããŒã¹ã¹ãããã·ã§ãããäœæã§ããŸãã
äžæ¹ãReaderFromã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããšãåã§ãªãŒããŒããçŽæ¥ããŒã¿ãèªã¿åãããšãã§ããŸãã
type ReaderFrom interface { ReadFrom(r Reader) (n int64, err error) }
èªè
ãšäœå®¶ã®é©å¿
ãªãŒããŒãåãå
¥ããæ©èœã¯ããããã©ã€ã¿ãŒããæã£ãŠããªãç¶æ³ã«é¥ãããšããããŸãã HTTPãªã¯ãšã¹ãã«ããŒã¿ãåçã«æžã蟌ãããšãã§ããŸãããhttp.NewRequestïŒïŒã¯Readerã®ã¿ãåãå
¥ããŸãã
io.PipeïŒïŒã䜿çšããŠã©ã€ã¿ãŒãå転ã§ããŸãã
func Pipe() (*PipeReader, *PipeWriter)
ããã§ã¯ãæ°ãããªãŒããŒãšã©ã€ã¿ãŒãååŸããŸãã PipeWriterã®ãšã³ããªã¯ãã¹ãŠPipeReaderã«ãªãã€ã¬ã¯ããããŸãã
ç§ã¯ãã®é¢æ°ããã£ãã«äœ¿çšããŸããã§ãããã exec.Cmdã¯ãã®é¢æ°ã䜿çšããŠStdinãStdoutãããã³Stderrãã€ããå®è£
ããŸããããã¯ãå®è¡äžã®ããã°ã©ã ãæäœãããšãã«éåžžã«åœ¹ç«ã¡ãŸãã
ã¹ã¬ããã®ã¯ããŒãº
ãã¹ãŠã®è¯ãããšãçµããã«è¿ã¥ããŠãããã¹ã¬ããã§ã®äœæ¥ãäŸå€ã§ã¯ãããŸããã Closerã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã¹ã¬ãããéããäžè¬çãªæ¹æ³ãæäŸããŸãã
type Closer interface { Close() error }
ããã§èª¬æããããšã¯ããŸããããŸããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯éåžžã«ã·ã³ãã«ã§ãããCloseïŒïŒã¡ãœããã§åžžã«ãšã©ãŒãè¿ãããã«ããŠããŸãããã®ãããå¿
èŠã«å¿ããŠç§ã®ã¿ã€ãããã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŸãã Closerã¯åžžã«çŽæ¥äœ¿çšãããããã§ã¯ãªããå€ãã®å Žåã ReadCloser ã WriteCloser ã ReadWriteCloserãªã©ã®ä»ã®ã€ã³ã¿ãŒãã§ã€ã¹ãšçµã¿åãããŠäœ¿çšââãããŸãã
ã¹ããªãŒã ããã²ãŒã·ã§ã³
ã¹ããªãŒã ã¯éåžžãæåããæåŸãŸã§åžžã«è¡šç€ºãããããŒã¿ã衚ããŸãããäŸå€ããããŸãã ããšãã°ããã¡ã€ã«ã¯ã¹ããªãŒã ã«ããããšãã§ããŸããããã¡ã€ã«å
ã®ä»»æã®äœçœ®ã«ä»»æã«ç§»åããããšãã§ããŸãã
Seekerã€ã³ã¿ãŒãã§ãŒã¹ã¯ãã¹ããªãŒã å
ãããã²ãŒãããæ©èœãæäŸããŸãã
type Seeker interface { Seek(offset int64, whence int) (int64, error) }
ç®çã®äœçœ®ã«ãžã£ã³ãããã«ã¯ãçŸåšã®äœçœ®ããã®ç§»è¡ãã¹ããªãŒã ã®æåããã®ç§»è¡ãæåŸããã®ç§»è¡ã®3ã€ã®æ¹æ³ããããŸãã ãã®ã¡ãœããã¯whenceåŒæ°ã§æå®ããŸãã offsetåŒæ°ã¯ãç§»åãããã€ãæ°ã瀺ããŸãã
ã¹ããªãŒã ãäžã«ç§»åãããšãåºå®ãµã€ãºã®ãããã¯ã䜿çšããå Žåãããã¡ã€ã«ã«ãªãã»ããä»ãã®ã€ã³ããã¯ã¹ãå«ãŸããå Žåã«åœ¹ç«ã¡ãŸãã ããŒã¿ãããããŒã«ãããã¹ããªãŒã ã®å
é ãããã©ã³ãžã·ã§ã³ã䜿çšããããšãè«ççã§ããå ŽåããããŸãããããŒã¿ãæ«å°Ÿã«ãããæ«å°Ÿããç§»åããæ¹ã䟿å©ãªå ŽåããããŸãã
ããŒã¿åã®æé©å
å¿
èŠãªã®ã1ãã€ããŸãã¯ã«ãŒã³ã ãã§ããå Žåãéšåã®èªã¿åãããã³æžã蟌ã¿ã¯éå±ãªå ŽåããããŸãã Goã«ã¯ããããå®çŸããããã®ã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã
åã
ã®ãã€ããæäœãã
ByteReaderããã³ByteWriterã€ã³ã¿ãŒãã§ã€ã¹ã¯ãåäžã®ãã€ããèªã¿æžãããããã®ç°¡åãªã¡ãœãããæäŸããŸãã
type ByteReader interface { ReadByte() (c byte, err error) } type ByteWriter interface { WriteByte(c byte) error }
ãã€ãæ°ã®ãã©ã¡ãŒã¿ãŒã¯ãããŸãããåžžã«0ãŸãã¯1ã«ãªããŸãããã€ããèªã¿æžããããŠããªãå Žåããšã©ãŒãè¿ãããŸãã
ByteScannerã€ã³ã¿ãŒãã§ã€ã¹ãããã ããã䜿çšãããšããããã¡ãªã³ã°ããããªãŒããŒã§ãã€ããç°¡åã«æäœã§ããŸãã
type ByteScanner interface { ByteReader UnreadByte() error }
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããšããã€ããã¹ããªãŒã ã«æ»ãããšãã§ããŸãã ããã¯ãããšãã°LLïŒ1ïŒããŒãµãŒãæžããšãã«ãåæ¹ãã€ããèŠãããšãã§ããã®ã§äŸ¿å©ã§ãã
åã
ã®ã«ãŒã³ãæäœãã
UnicodeããŒã¿ãè§£æããŠããå Žåã¯ãåã
ã®ãã€ãã§ã¯ãªãã«ãŒã³æåã䜿çšããå¿
èŠããããŸãã ãã®å Žåã RuneReaderããã³RuneScannerã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããå¿
èŠããããŸã ã
type RuneReader interface { ReadRune() (r rune, size int, err error) } type RuneScanner interface { RuneReader UnreadRune() error }
ãããã«
ãã€ãã¹ããªãŒã ã¯ãå€ãã®Goããã°ã©ã ã«ãšã£ãŠéèŠã§ãã ãããã¯ããããã¯ãŒã¯æ¥ç¶ãããã£ã¹ã¯äžã®ãã¡ã€ã«ããŠãŒã¶ãŒã®ããŒããŒãå
¥åãŸã§ããã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ãã ioããã±ãŒãžã¯ãããããã¹ãŠãæäœããããã®åºæ¬çãªããªããã£ããæäŸããŸãã
ãã€ãã®èªã¿åããæžã蟌ã¿ãã³ããŒãããã³ç¹å®ã®ã¿ã¹ã¯ã«å¯Ÿãããããã®æäœã®æé©åã«ã€ããŠæ€èšããŸããã ãããã®ããªããã£ãã¯åçŽã«èŠãããããããŸããããããŒã¿ãç©æ¥µçã«æäœããŠããã¢ããªã±ãŒã·ã§ã³ã®åºæ¬çãªæ§æèŠçŽ ã§ãã
ioããã±ãŒãžãæ
éã«æ€èšããããã°ã©ã ã§ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãã ããã ãŸãã ioããã±ãŒãžã®è峿·±ãäœ¿çšæ¹æ³ãšããã®ã·ãªãŒãºã®èšäºãæ¹åããããã®ãã³ããå
±æããŠããã ããã°å¹žãã§ãã