为了减少默认的64k scanner 缓冲区(for microcomputer with low memory),我try 使用此缓冲区和自定义拆分功能:

scanner.Buffer(make([]byte, 5120), 64)
scanner.Split(Scan64Bytes)

在这里,我注意到第二个缓冲区参数"max"没有效果.如果我改为插入例如015120bufio.MaxScanTokenSize,我看不出有任何区别.

从文件中:

最大令牌大小是max和cap(buf)中的较大值.如果max<=cap(buf),扫描将仅使用此缓冲区,不进行分配.

我不明白哪个是正确的最大值.你能给我解释一下吗?

Go Playground

package main

import (
    "bufio"
    "bytes"
    "fmt"
)

func Scan64Bytes(data []byte, atEOF bool) (advance int, token []byte, err error) {
    if len(data) < 64 {
        return 0, data[0:], bufio.ErrFinalToken
    }
    return 64, data[0:64], nil
}

func main() {
    // improvised source of the same size:
    cmdstd := bytes.NewReader(make([]byte, 5120))
    scanner := bufio.NewScanner(cmdstd)

    // I guess 64 is the correct max arg:
    scanner.Buffer(make([]byte, 5120), 64)
    scanner.Split(Scan64Bytes)

    for i := 0; scanner.Scan(); i++ {
        fmt.Printf("%v: %v\r\n", i, scanner.Bytes())
    }

    if err := scanner.Err(); err != nil {
        fmt.Println(err)
    }
}

推荐答案

最大值对自定义拆分没有影响?

不,没有分裂,结果是一样的.但如果没有split和ErrFinalToken,这是不可能的:

//your reader/input
cmdstd := bytes.NewReader(make([]byte, 5120))

// your scanner buffer size
scanner.Buffer(make([]byte, 5120), 64)

scanner 的缓冲区大小应该更大.这就是我设置buf和max的方式:

scanner.Buffer(make([]byte, 5121), 5120)

Go相关问答推荐

try 用GitHub操作中的release标签更新version. go文件,但失败了

读取JSON数据并在网页上显示

macOS上GoLand 2023.3.4中的代码导航

使用ciph.AEAD.Seal()查看内存使用情况

在Mac中使用uname获取处理器体系 struct 时,在为AMD64构建Go二进制时出现错误结果

Go中的net.SplitHostPort(r.RemoteAddr)安全性

Cypher 查找(多个)最低 node

我可以扫描表中每个项目的最高范围键值吗?

未实现的 desc = 未知服务 pb.AuthService 我的简单身份验证服务器上出现错误

如何将 goose 迁移与 pgx 一起使用?

该文件位于模块.内,该模块不包含在您的工作区中

如何从Go项目连接Microsoft Access数据库?

一个Go module可以和之前的非module模块发布在同一个路径下吗?

Golang crypto/rand 线程安全吗?

errors.Wrap 和 errors.WithMessage 有什么区别

fmt.Printf() 标志 '0' 不会被字符串忽略

如何在 golang revel 中获取动态应用程序配置

如何在 GORM 中获取字段值

将接口方法的参数限制为几个允许的 struct ?

使用 xml.Name 将 xml 解组为 [] struct