Go bufio之Reader | 青训营笔记

111 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第1天

Go bufio之Read系列

写一些课程涉及而我却不了解的

1. bufio

之前都是使用fmt进行输入输出的,今天看到了bufio进行输入输出,决定搞一稿

  • 视频中相关代码为
reader := bufio.NewReader(os.Stdin)
input,err := reader.ReadString('\n')
input = strings.TrimSuffix(input,"\n")
guess,err := strconv.Atoi(input)

代码大概意思和扩展:

  1. 是新建一个Reader,其中Reader的参数是一个Reader类,如果是stdin的话就从键盘读入,那么不从键盘处理字符串会如何?请看👇
    s :="http://mujinsong.top\n haha"
    reader := bufio.NewReader(strings.NewReader(s))
    l1, _ := reader.ReadString('\n') //遇到\n就停止
    fmt.Println(l1) //http://mujinsong.top
    l1, _ = reader.ReadString('\n')//读到头了,也停
    fmt.Println(l1)//haha
    
    从结果可以看出,第一次ReadString 的结果,在第二次调用读操作后,内容发生了变化。也就是说,ReadString 返回的 string 是指向的,而不是copy一份返回。
  2. 从Reader中读取字符串,这里用的是ReadString(),看了看源码发现
    func (b *Reader) ReadString(delim byte) (line string, err error) {
            bytes, err := b.ReadBytes(delim)
            return string(bytes), err
        }
    
    ??????????????????????(满头文号)???????????????????????
    这里面就是把ReadBytes()返回的bytes给变成string类型就返回了,那ReadBytes()又是何方神圣? 看例子👇
    s := "http://mujinsong.top\n haha"
    reader := bufio.NewReader(strings.NewReader(s))
    l1, _ := reader.ReadBytes('\n')
    fmt.Println(l1) //[104 116 116 112 58 47 47 109 117 106 105 110 115 111 110 103 46 116 111 112 10]
    fmt.Println(string(l1)) //http://mujinsong.top
    l2, _ := reader.ReadBytes('\n')
    fmt.Println(l2)//[32 104 97 104 97]
    fmt.Println(string(l2))//haha
    
    一看输入输出就明白了吧,ReadBytes 从输入中读取直到遇到界定符(delim)为止,返回的 slice 包含了从当前到界定符的内容  (包括界定符) 其返回的类型是[]uint8(用的reflect.TypeOf()查看类型)。
  3. 去掉回车(不是重点不多解释,不过总感觉既然\n就停止,那去掉回车直接把最后一位去掉不就行了,欢迎大佬指点一下)
  4. 字符串转int(不是重点不多解释)
  • 扩展
    发现还有一个ReadSelice()函数,其类型与Readbytes()目前看是一样,其它相关函数如下👇,你应该可以通过函数名看懂是大概干啥吧🤪
    func (b *Reader) Read(p []byte) (n int, err error)
    func (b *Reader) ReadByte() (c byte, err error)
    func (b *Reader) ReadRune() (r rune, size int, err error)
    func (b *Reader) UnreadByte() error
    func (b *Reader) UnreadRune() error
    func (b *Reader) WriteTo(w io.Writer) (n int64, err error)