如何将一种类型转换为字节数组

下面是一个有效的例子

// You can edit this code!
// Click here and start typing.
package main

import (
    "bytes"
    "fmt"
    "reflect"
)

type Signature [5]byte

const (
    /// Number of bytes in a signature.
    SignatureLength = 5
)

func main() {

    var bytes0to64 Signature = SignatureFromBytes([]byte("Here is a string.........."))
    fmt.Println(reflect.TypeOf(bytes0to64))

    res := bytes.Compare([]byte("Test"), bytes0to64)
    if res == 0 {
        fmt.Println("!..Slices are equal..!")
    } else {
        fmt.Println("!..Slice are not equal..!")
    }

}

func SignatureFromBytes(in []byte) (out Signature) {
    byteCount := len(in)
    if byteCount == 0 {
        return
    }

    max := SignatureLength
    if byteCount < max {
        max = byteCount
    }

    copy(out[:], in[0:max])
    return
}

在Go lang中

type Signature [5]byte

所以这是意料之中的

var bytes0to64 Signature = SignatureFromBytes([]byte("Here is a string.........."))
    fmt.Println(reflect.TypeOf(bytes0to64))

它只是将类型输出到

main.Signature

这是正确的,现在我想从中获取字节数组,用于下一级处理,并得到一个编译错误

./prog.go:23:29: cannot use bytes0to64 (type Signature) as type []byte in argument to bytes.Compare

Go build failed.

这个错误是正确的,只是比较不匹配.现在,我应该如何将签名类型转换为字节数组

推荐答案

由于Signature是一个字节数组,您可以简单地将其设置为slice:

bytes0to64[:]

这将导致值为[]byte.

测试它:

res := bytes.Compare([]byte("Test"), bytes0to64[:])
if res == 0 {
    fmt.Println("!..Slices are equal..!")
} else {
    fmt.Println("!..Slice are not equal..!")
}
res = bytes.Compare([]byte{72, 101, 114, 101, 32}, bytes0to64[:])
if res == 0 {
    fmt.Println("!..Slices are equal..!")
} else {
    fmt.Println("!..Slice are not equal..!")
}

这将输出(在Go Playground上try ):

!..Slice are not equal..!
!..Slices are equal..!

Go相关问答推荐

无法找到与golang、nginx和postquist进行的docker-compose./主要

Golang应用程序:所请求的资源上不存在HTTP-Control-Allow-Origin标头

如何在 zap 记录器库中使用自定义时间函数

Go 中将 int 切片转换为自定义 int 切片指针类型的函数

如何创建在responseWriter.Write 上返回错误的http.ResponseWriter 模拟实例?

切片的下限和上限

加载 docker 镜像失败

具有两个参数的动态规划:天数和优惠券

甚至用天真的洗牌分配?

读取非UTF8编码的文件内容并正确打印出来

在 Golang 模板中计算时间/持续时间

如何使用特定的 Go 版本运行 govulncheck?

同时调用应该只获取一次数据

使用 delve 在容器中调试 Golang:container_linux.go:380:启动容器进程导致:exec:/dlv:stat /dlv:没有这样的文件或目录

在 Golang 中获取谷歌云服务帐户的访问令牌?

退格字符在围棋操场中不起作用

无法识别同步错误.使用一次

正则表达式处理数字签名的多个条目

Golang LinkedList 删除第一个元素

如何在程序退出时使用 golang 删除文件?