[]uint8和[]byte(Golang切片)之间的区别

25

我正在运行的其中一个函数是:image.Decode()

image.Decode()函数接受一个io.Reader类型的参数, 而io.Reader函数则需要传入一个[]byte类型的参数。

当我传入一个[]uint8类型的参数时,它会给出以下错误提示:

panic: image: unknown format

我该如何将 []uint8 转换为 []byte?

UPDATE

在星号区域发生错误是因为 image.Decode 无法读取变量 xxx。

    package main

    import (
        "github.com/nfnt/resize"
        "image"
        "image/jpeg"
        "fmt"
        "launchpad.net/goamz/aws"
        "launchpad.net/goamz/s3"
        "bytes"
        "encoding/json"
        "io/ioutil"
        "os"
        "reflect"
    )

    type Data struct {
        Key string
    }

    func main() {

      useast := aws.USEast

      connection := s3.New(auth, useast)
      mybucket := connection.Bucket("bucketName")

      image_data, err := mybucket.Get("1637563605030")

      if err != nil {
        panic(err.Error())
      } else {
        fmt.Println("success")
      }

      xxx := []byte(image_data)

      ******* THIS IS WHERE THE ERROR OCCURS **************

      original_image, _, err := image.Decode(bytes.NewReader(xxx))

      ******* THIS IS WHERE THE ERROR OCCURS END **************

      if err != nil {
        fmt.Println("Shit")
        panic(err.Error())
      } else {
        fmt.Println("Another success")
      }

      new_image := resize.Resize(160, 0, original_image, resize.Lanczos3)

      if new_image != nil {
        fmt.Println("YAY")
      }
    }

1
你能提供图片和代码示例吗?我不认为[]uint8是问题所在,例如这个可以工作:http://play.golang.org/p/PXxN-iLeuB - Kluyg
3个回答

62

The Go Programming Language Specification

Numeric types

uint8       the set of all unsigned  8-bit integers (0 to 255)

byte        alias for uint8

package main

import "fmt"

func ByteSlice(b []byte) []byte { return b }

func main() {
    b := []byte{0, 1}
    u8 := []uint8{2, 3}
    fmt.Printf("%T %T\n", b, u8)
    fmt.Println(ByteSlice(b))
    fmt.Println(ByteSlice(u8))
}

输出:

[]uint8 []uint8
[0 1]
[2 3]

你对问题的诊断有误。

你也可以直接使用它: []byte([]uint8{uint8(2), uint8(3)}) - Xeoncross

7
正如其他答案所解释的那样,将 []uint8 传递到需要 []byte 的地方没有问题。如果这是您的问题,您将会得到编译时错误。但您没有。当图像库读取切片中的数据时,它会抛出运行时错误(panic)。
实际上,图像库只是部分原因。请参见http://golang.org/src/pkg/image/format.go。它返回一个错误消息,因为它无法识别切片中数据的图像格式。您的代码调用image.Decode()时,当image.Decode()返回错误消息时,会调用panic

@JorgeOlivero,你在S3存储桶中存储了一些不是图像(或者不是Go库能够识别的格式)的东西。 - Ken Bloom

-1

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