GO - code
写在前面
别问我为什么go算作后端,因为我学他就是用来写自己的后端的。JAVA起项目太离谱了。 做笔记是因为每次学每次都会忘,将重点记下来好了。
net
dial
go
// 测试接口是否开着
address := fmt.Sprintf("121.40.236.59:%d", port)
conn, err := net.Dial("tcp", address)
os
Args
go
// 当我们将项目build完以后,可以通过该方法获取到调用可执行文件时后面跟的参数
// 从1开始是因为0就是调用命令本身
os.Args[1:]
Stdin
bufio
NewReader()
之前使用的时候好像有一点bug
go
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
bufio
创建一个缓冲区,读和写都现在这个缓冲区,最后再读写文件,降低访问硬盘的次数以此提高整体的效率。其封装了io.Reader和io.Writer接口对象。
go
// Reader implements buffering for an io.Reader object.
type Reader struct {
buf []byte
rd io.Reader // reader provided by the client
r, w int // buf read and write positions
err error
lastByte int // last byte read for UnreadByte; -1 means invalid
lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid
}
bufio.Read(p []byte) 相当于读取大小len(p)的内容,思路如下:
- 当缓存区有内容的时,将缓存区内容全部填入p并清空缓存区
- 当缓存区没有内容的时候且len(p)>len(buf),即要读取的内容比缓存区还要大,直接去文件读取即可
- 当缓存区没有内容的时候且len(p)<len(buf),即要读取的内容比缓存区小,缓存区从文件读取内容充满缓存区,并将p填满(此时缓存区有剩余内容)
- 以后再次读取时缓存区有内容,将缓存区内容全部填入p并清空缓存区,如情况1.
注意
- bufio.Reader不是并发安全的,多个协程同时读取同一实例会导致数据竞争
- 由于用了底层的io.Reader,因此是有最大上限(4KB缓冲区),可以通过
reader := bufio.NewReaderSize(os.Stdin, 16)
进行设置
go
type Writer struct {
err error
buf []byte
n int
wr io.Writer
}
bufio.Write(p []byte) 的思路如下
- 判断buf中可用容量是否可以放下 p
- 如果能放下,直接把p拼接到buf后面,即把内容放到缓冲区
- 如果缓冲区的可用容量不足以放下,且此时缓冲区是空的,直接把p写入文件即可
- 如果缓冲区的可用容量不足以放下,且此时缓冲区有内容,则用p把缓冲区填满,把缓冲区所有内容写入文件,并清空缓冲区
- 判断p的剩余内容大小能否放到缓冲区,如果能放下(此时和步骤1情况一样)则把内容放到缓冲区
- 如果p的剩余内容依旧大于缓冲区,(注意此时缓冲区是空的,情况和步骤3一样)则把p的剩余内容直接写入文件
go
writer := bufio.NewWriter(file) // 默认缓冲区 4096 字节
writer.WriteString("Hello, Flush!\n")
writer.Flush() // 强制将缓冲区数据写入文件
感觉像是指定了一个文件创造缓冲区,然后Flush方法可以清空缓冲区,不然得等缓冲区满才会写入。Flush方法只有Writer才有。