这是我参与「第五届青训营 」伴学笔记创作活动的第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)
代码大概意思和扩展:
- 是新建一个Reader,其中Reader的参数是一个Reader类,如果是stdin的话就从键盘读入,那么不从键盘处理字符串会如何?请看👇
从结果可以看出,第一次ReadString 的结果,在第二次调用读操作后,内容发生了变化。也就是说,ReadString 返回的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)//hahastring是指向的,而不是copy一份返回。 - 从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()又是何方神圣? 看例子👇一看输入输出就明白了吧,ReadBytes 从输入中读取直到遇到界定符(delim)为止,返回的 slice 包含了从当前到界定符的内容 (包括界定符) 其返回的类型是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[]uint8(用的reflect.TypeOf()查看类型)。 - 去掉回车(不是重点不多解释,不过总感觉既然\n就停止,那去掉回车直接把最后一位去掉不就行了,欢迎大佬指点一下)
- 字符串转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)