Skip to content

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)的内容,思路如下:

  1. 当缓存区有内容的时,将缓存区内容全部填入p并清空缓存区
  2. 当缓存区没有内容的时候且len(p)>len(buf),即要读取的内容比缓存区还要大,直接去文件读取即可
  3. 当缓存区没有内容的时候且len(p)<len(buf),即要读取的内容比缓存区小,缓存区从文件读取内容充满缓存区,并将p填满(此时缓存区有剩余内容)
  4. 以后再次读取时缓存区有内容,将缓存区内容全部填入p并清空缓存区,如情况1.

注意

  1. bufio.Reader​​不是并发安全的​​,多个协程同时读取同一实例会导致数据竞争
  2. 由于用了底层的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) 的思路如下

  1. 判断buf中可用容量是否可以放下 p
  2. 如果能放下,直接把p拼接到buf后面,即把内容放到缓冲区
  3. 如果缓冲区的可用容量不足以放下,且此时缓冲区是空的,直接把p写入文件即可
  4. 如果缓冲区的可用容量不足以放下,且此时缓冲区有内容,则用p把缓冲区填满,把缓冲区所有内容写入文件,并清空缓冲区
  5. 判断p的剩余内容大小能否放到缓冲区,如果能放下(此时和步骤1情况一样)则把内容放到缓冲区
  6. 如果p的剩余内容依旧大于缓冲区,(注意此时缓冲区是空的,情况和步骤3一样)则把p的剩余内容直接写入文件
go
writer := bufio.NewWriter(file) // 默认缓冲区 4096 字节
writer.WriteString("Hello, Flush!\n")
writer.Flush() // 强制将缓冲区数据写入文件

  感觉像是指定了一个文件创造缓冲区,然后Flush方法可以清空缓冲区,不然得等缓冲区满才会写入。Flush方法只有Writer才有。