go - 扫描精确的字符数

标签 go

下面的代码打印 15 因为它在输入中最多扫描 2 个字符。如果没有成功扫描正好2个字符,是否有可能使其失败?

package main

import (
    "errors"
    "fmt"
    "log"
)

func main() {
    var v uint8
    n, e := fmt.Sscanf("f!", "%02x", &v)
    if e != nil {
        log.Fatal(e)
    }
    if n != 1 {
        log.Fatal(errors.New("error"))
    }
    fmt.Println(v)
}

https://play.golang.org/p/Wl3QyjS8YS

最佳答案

我认为这不能用 fmt.Sscanf 来完成。

但是如果改用 strconv 呢?

这是一个例子:

package main

import (
    "strconv"
    "fmt"
)

// parse reads a uint8 from s on exactly size digits in base 16
func parse( s string, size int ) (uint8, error) {
    if len(s) != size {
        return 0, strconv.ErrSyntax
    }
    n,err := strconv.ParseUint(s,16,8)
    return uint8(n),err
}

func main() {
    for _,x := range []string{ "ff", "f", "", "f!", "12", "00", "fff" } {
        if v,e := parse(x,2); e == nil {
            fmt.Println("ok:",v)
        } else {
            fmt.Println("ko:",e)
        }
    }   
}

在 Playground 上:https://play.golang.org/p/PRkX0Wztz7

关于go - 扫描精确的字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27878003/

相关文章:

go - slice of slice 中的接口(interface)转换

go - 将字符串传递给golang中的模板

json - 使用 "valid"零值解码 JSON

go - 读取文本文件中的最后一行

go - 如何使函数适用于不同的输入类型?

go - 使用 SETNX 的单实例 Redis 锁

go - 在 Golang 中进行依赖注入(inject)的最佳方式是什么

sql - 模式交换支持 Go GORM

docker - 以编程方式检查 Docker 容器进程是否以非零状态结束

command-line - 默认命令行参数值的编译错误