在Go中将int转换为单个字节

4

https://github.com/tarm/serial/blob/master/serial.go#L103

type StopBits byte
type Parity byte

type Config struct {
    Name        string
    Baud        int
    ReadTimeout time.Duration
    Size byte
    Parity Parity
    StopBits StopBits
}

我正在尝试标记命令行并填写配置结构体,但我无法弄清如何将int或string转换为单个字节?例如,长度为7。已尝试:
mysize := "7"
mysize[0]

但是 tarm/serial 告诉我 serial.Config 中有无效输入错误。

i, err := strconv.Atoi("7")

编译器报错,说我不能执行i.(byte)。唯一的解决办法是在配置结构体中硬编码size: 7

byte(i)[]byte(string(i))将int设置为byte。请参见https://dev59.com/e2Yr5IYBdhLWcg3w0taE#62737936。`strconv.Atoi(s)`和`byte(i)`将字符串设置为字节。请参见https://dev59.com/OVwZ5IYBdhLWcg3waPvX#62740786。`int(b)`或`int(b[0])`将字节设置为int。请参见https://dev59.com/CmIk5IYBdhLWcg3wfOSe#62725637。 - user12817546
2个回答

18
您可以将int转换为byte:https://play.golang.org/p/w0uBGiYOKP
val := "7"
i, _ := strconv.Atoi(val)
byteI := byte(i)
fmt.Printf("%v (%T)", byteI, byteI)

编译器抱怨我不能使用i.(byte)。
当然,因为这是一种类型断言,如果i不是给定类型(例如你的例子中的byte)或者它不是一个接口,它将会失败。请注意保留HTML标记。

4
为了使用类型断言(您正在进行的操作),您需要左边有一个接口。您可能会收到“左侧非接口类型byte”的错误消息-这是正确的,因为您已经知道该类型。相反,您应该进行强制类型转换。
您应该使用byte(i)而不是i.(byte):
i := 12
c := byte(i)
fmt.Println(c) //12

当你有一个int超过了byte可以容纳的最大值时要小心;你将会溢出这个byte。在这种情况下,如果超过了255(单个byte可以容纳的最大值),那么你将会溢出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接