试图将[]byte的一个片段映射到[]*byte.Reader的一个切片以用于映射到解码图像,结果是使用泛型使用go1.18生成cannot use jpeg.Decode (value of type func(r io.Reader) (image.Image, error)) as func(item *bytes.Reader) (image.Image, error)
package main
import (
"bytes"
"fmt"
"image"
"image/jpeg"
"log"
)
func main() {
imagesBytes := [][]byte{
[]byte("test1"),
[]byte("test2"),
}
jpeg.Decode(bytes.NewReader(imagesBytes[0])) // works
readers := Map(imagesBytes, bytes.NewReader)
images, err := MapWithErr(readers, jpeg.Decode) // cannot use jpeg.Decode (value of type func(r io.Reader) (image.Image, error)) as func(item *bytes.Reader) (image.Image, error) value in argument to MapWithErr[*bytes.Reader, image.Image]compilerIncompatibleAssign
if err != nil {
log.Fatal(err)
}
fmt.Println(images)
}
func MapWithErr[T1 any, T2 any](items []T1, predicate func(item T1) (T2, error)) ([]T2, error) {
output := make([]T2, len(items))
for idx, item := range items {
o, err := predicate(item)
if err != nil {
output = nil
return output, err
}
output[idx] = o
}
return output, nil
}
func Map[T1 any, T2 any](items []T1, predicate func(item T1) T2) []T2 {
output := make([]T2, len(items))
for idx, item := range items {
output[idx] = predicate(item)
}
return output
}为什么我可以直接将一个*bytes.Reader传递到jpeg.Decode(),但是在映射和使用泛型时,它不起作用?
发布于 2022-03-27 21:38:44
因为io.Reader函数中的可接受参数( jpeg.Decode() )类型是接口类型,如果您输出bytes.NewReader函数并将一种类型的*byte.Reader传递给jpeg.Decode ()函数,那么没有问题,但是MapWithErr函数中的第二个参数是函数类型,而不是接口,现在该参数的输入必须与接收到的函数及其参数完全兼容。换言之:
*Bytes.Reader和io.Reader类型并不相等,只能将*Bytes.Reader转换为io.Reader。
https://stackoverflow.com/questions/71639197
复制相似问题