【问题标题】:How to convert [4]uint8 into uint32 in Go?如何在 Go 中将 [4]uint8 转换为 uint32?
【发布时间】:2011-11-14 20:40:14
【问题描述】:

如何将 go 的类型从 uint8 转换为 unit32?
只需代码:

package main

import (
    "fmt"
)

func main() {
    uInt8 := []uint8{0,1,2,3}
    var uInt32 uint32
    uInt32 = uint32(uInt8)
    fmt.Printf("%v to %v\n", uInt8, uInt32)
}

~>6g test.go && 6l -o test test.6 && ./test
test.go:10:无法将 uInt8(类型 []uint8)转换为类型 uint32

【问题讨论】:

  • 你没有指定你想要什么,这就是你得到完全不同答案的原因。您想要 one uint32 的值为 0x00010203one uint32 的值为 0x03020100 还是 four @987654326 @s 的值为 {0, 1, 2, 3}?

标签: type-conversion go


【解决方案1】:
package main

import (
    "encoding/binary"
    "fmt"
)

func main() {
    u8 := []uint8{0, 1, 2, 3}
    u32LE := binary.LittleEndian.Uint32(u8)
    fmt.Println("little-endian:", u8, "to", u32LE)
    u32BE := binary.BigEndian.Uint32(u8)
    fmt.Println("big-endian:   ", u8, "to", u32BE)
}

输出:

little-endian: [0 1 2 3] to 50462976
big-endian:    [0 1 2 3] to 66051

Go binary package 函数被实现为一系列班次。

func (littleEndian) Uint32(b []byte) uint32 {
    return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
}

func (bigEndian) Uint32(b []byte) uint32 {
    return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
}

【讨论】:

  • 另外值得注意的是,如果你知道len(b) &gt;= 4并且不关心字节序,使用return *(*uint32)(unsafe.Pointer(&amp;b[0]))会快很多。
【解决方案2】:

你想following吗?

t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}

【讨论】:

  • 您正在将[]int 转换为[]interface{}。这不是问题所要求的。
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 2017-02-20
  • 2017-03-11
  • 2016-02-17
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多