[] uint8 && [] byte(Golang Slices)之间的区别

One of the functions I am running: image.Decode()

The image.Decode function takes in an io.Reader && and the io.Reader function takes in a []byte.

When I pass in a []uint8, if gives me this error:

panic: image: unknown format

How do I convert the []uint8 to []byte?

UPDATE

The error is happening at the starred area because image.Decode can't read the variable 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")
      }
    }

If you have a variable imageData that is []uint8 you may pass []byte(imageData)

See http://golang.org/ref/spec#Conversions

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
", b, u8)
    fmt.Println(ByteSlice(b))
    fmt.Println(ByteSlice(u8))
}

Output:

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

You have misdiagnosed your problem.

As the other answers have explained, there's no problem passing a []uint8 where a []byte is required. If this was your problem, you'd be getting a compile time error. You aren't. A panic is a runtime error, and it's being thrown by the image library when it reads the data in the slice.

In fact, the image library is only partially your problem. See http://golang.org/src/pkg/image/format.go. It's returning an error message because it doesn't recognize the image format of the data in the slice. Your code, which calls image.Decode() is calling panic when image.Decode() returns the error message.