Разница между [] uint8 && [] байт (Golang Slices)
Одна из выполняемых мной функций: image.Decode()
Функция image.Decode включает в себя io.Reader && и функция io.Reader принимает байт [].
Когда я перехожу в [] uint8, если дает мне эту ошибку:
panic: image: unknown format
Как преобразовать [] uint8 в [] байт?
ОБНОВИТЬ
Ошибка происходит в помеченной области, потому что изображение .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
Спецификация языка программирования Go
Числовые типы
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]
Вы неправильно определили свою проблему.
Ответ 2
Как объяснили другие ответы, нет проблемы с передачей []uint8
, где требуется []byte
. Если это была ваша проблема, вы получите ошибку времени компиляции. Это не так. Паника - это ошибка времени выполнения, и она бросается библиотекой изображений при чтении данных в срезе.
Фактически, библиотека изображений является лишь частично вашей проблемой. См. http://golang.org/src/pkg/image/format.go. Он возвращает сообщение об ошибке, поскольку он не распознает формат изображения данных в срезе. Ваш код, вызывающий image.Decode()
, вызывает panic
, когда image.Decode()
возвращает сообщение об ошибке.
Ответ 3
Если у вас есть переменная imageData
, которая []uint8
, вы можете пройти []byte(imageData)
См. http://golang.org/ref/spec#Conversions