Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gunosy.go #1 bufio

Gunosy.go #1 bufio

Go の bufio パッケージの紹介

Hiroshi Kurokawa

June 16, 2014
Tweet

More Decks by Hiroshi Kurokawa

Other Decks in Programming

Transcript

  1. ࣗݾ঺հ w ࠇ઒༸!IZESBLFDBU w גࣜձࣾ(VOPTZॴଐ w "OESPJEΞϓϦ։ൃ୲౰ w ࢖༻ݴޠ
 +BWB1ZUIPO4DIFNF

    w ޷͖ͳΤσΟλ*.&
 &NBDT4,, w (Pྺ
 ໿೔
 (P$PO4QSJOHͷϋϯζΦϯͰ ॳΊͯ৮Δ
  2. ࢖͍ํ IUUQQMBZHPMBOHPSHQ:/V(T.JCLM   //  open  output  file     out,

     err  :=  os.Create(“output.txt")   !   //  close  out  on  exit  and  check  for  its  returned  error     defer  func()  {       if  err  :=  out.Close();  err  !=  nil  {         panic(err)       }     }()   !   //  make  a  write  buffer     w  :=  bufio.NewWriter(out)   !   //  make  a  buffer  to  keep  chunks  that  are  read     buf  :=  make([]byte,  1024)     for  {       //  read  a  chunk       n,  err  :=  r.Read(buf)   !     if  n  ==  0  {         break       }   !     //  write  a  chunk       if  _,  err  :=  w.Write(buf[:n]);  err  !=  nil  {         panic(err)       }     }   !   if  err  =  w.Flush();  err  !=  nil  {       panic(err)     }
  3. ஫ҙ఺ w ϥοϓ͍ͯ͠ΔJP3FBEFS8SJUFSΛΫϩʔζ͠ͳ ͍ͱ͍͚ͳ͍ w CVpP3FBEFS8SJUFSʹ͸$MPTFϝιου͸ͳ͍ w ࠷ޙʹ'MVTI Λݺ͹ͳ͍ͱ͍͚ͳ͍ w

    υΩϡϝϯτʹΑΔͱɺ3FBE-JOF ͸࢖Θͳ͍ํ ͕ྑ͍Β͍͠ɻ୅ΘΓʹ4DBOOFSΛ࢖͏ํ͕ྑ͍ Β͍͠ɻ
  4. ศར ͦ͏ͳ ϝιου w 3FBE3VOF 
 65'Τϯίʔυ͞Εͨ6OJDPEFจࣈΛҰจࣈಡΈ ࠐΉ w 1FFL

    
 ࣍ͷOόΠτΛSFBEFSΛਐΊΔ͜ͱͳ͘ฦ͢ w 6OSFBE#ZUF 
 ࠷ऴόΠτΛະಡΈࠐΈঢ়ଶʹ͢Δ

  5. ྫ IUUQQMBZHPMBOHPSHQES65.JZ   //  make  a  read  buffer    

    r  :=  bufio.NewReader(in)   !   rune,  size,  _  :=  r.ReadRune()     fmt.Printf("The  first  rune:  %x,  size=%d\n",  rune,  size)   !   if  err  :=  r.UnreadRune();  err  !=  nil  {       panic(err)     }     fmt.Printf("The  first  rune  again:  %x,  size=%d\n",  rune,  size)  
  6. 4DBOOFS   IUUQQMBZHPMBOHPSHQRV.0@-#Z8   //  Scan  lines    

    scanner  :=  bufio.NewScanner(os.Stdin)     for  scanner.Scan()  {       fmt.Println(scanner.Text())  //  Println  will  add  back  the  final  '\n'     }   !   //  Scan  words     const  input  =  "Now  is  the  winter  of  our  discontent,\nMade  glorious  summer  by  this  sun   of  York.\n"     scanner  :=  bufio.NewScanner(strings.NewReader(input))     //  Set  the  split  function  for  the  scanning  operation.     scanner.Split(bufio.ScanWords)     //  Count  the  words.     count  :=  0     for  scanner.Scan()  {       count++     }     if  err  :=  scanner.Err();  err  !=  nil  {       fmt.Fprintln(os.Stderr,  "reading  input:",  err)     }     fmt.Printf("%d\n",  count)
  7. 4DBOOFS    //  An  artificial  input  source.    

         const  input  =  "1234  5678  1234567901234567890"          scanner  :=  bufio.NewScanner(strings.NewReader(input))          //  Create  a  custom  split  function  by  wrapping  the  existing  ScanWords  function.          split  :=  func(data  []byte,  atEOF  bool)  (advance  int,  token  []byte,  err  error)  {                          advance,  token,  err  =  bufio.ScanWords(data,  atEOF)                          if  err  ==  nil  &&  token  !=  nil  {                                          _,  err  =  strconv.ParseInt(string(token),  10,  32)                          }                          return          }          //  Set  the  split  function  for  the  scanning  operation.          scanner.Split(split)          //  Validate  the  input          for  scanner.Scan()  {                          fmt.Printf("%s\n",  scanner.Text())          }            
  8. ͓·͚d೔ؒ࢖ͬͯd w (Pͷྑ͍ͱ͜Ζ w จ๏͕γϯϓϧ w ੩తܕ෇͚ w ଎͍ w

    ඪ४ϥΠϒϥϦ͕ΘΓͱॆ࣮͍ͯ͠Δ w τϦοΩʔͳ͜ͱΛͤ͞ͳ͍࢟੎ FYNBQͷJUFSBUJPOPSEFS  w (PͷϋϚΓͦ͏ͳͱ͜Ζ w εϥΠε w ϩοΫपΓ w ྫ֎ॲཧ