我正在学习Golang,为了好玩,我try 创建一个Map函数,该函数接受切片的My包装器(其中包含使用Go 1.22的GOEXPERIMENT=rangefunc的Iter函数).但是在Map函数中,编译器给我这个错误:"不能在f的参数中使用i(int类型的变量)作为T值".

type IterableSlice[T any] struct {
    slice []T
}

func (is IterableSlice[T]) Iter(yield func(T) bool) {
    for _, v := range is.slice {
        yield(v)
    }
}

func Map[T, V any](is IterableSlice[T], f func(T) V) IterableSlice[V] {
    var a []V

    for i := range is.slice {
        f(i)
    }

    return IterableSlice[V]{a}
}

func main() {
    a := []int{
        1, 2, 3, 4, 5,
    }

    is := IterableSlice[int]{a}

    var isf IterableSlice[float32]
    isf = Map(is, func(x int) float32 {
        return float32(x)
    })

    for i := range isf.Iter {
        fmt.Println(i)
    }
}

我正在努力解决这个错误,或者至少理解这是围棋中不可能做的事情

推荐答案

问题就在这里:

    for i := range is.slice {
        f(i)
    }

这里的i是指数.该指数的类型为int.它不能传递给f,它需要类型T的值.

我想你想要的是:

    for _, i := range is.slice {
        f(i)
    }

没有判断是否有任何其他问题...

Go相关问答推荐

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

macOS上GoLand 2023.3.4中的代码导航

如何用Golang解码这个嵌套的json?

在Go中旋转矩阵

如何在golang中使用viper获取对象的配置数组?

使用Goldmark在golang中添加ChildNode会导致堆栈溢出

为什么我只收到部分错误而不是我启动的 goroutines 的所有错误?

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

Go 切片容量增长率

致命错误 - 所有 Goroutines 都睡着了!僵局

GOLANG:为什么 SetDeadline/SetReadDeadline/SetWriteDeadline 在使用 os.File.Fd() 时对文件不起作用?

在 Golang 模板中计算时间/持续时间

使用 GO 在侧 tar 文件中提取 tar 文件的最快方法

无法访问 Go 模块导入的远程存储库

Go 中 SDL Surface 的 OpenGL 纹理

GRPC 反向代理混淆 GRPC 和 GRPC-Web

golang jwt.MapClaims 获取用户ID

Golang API 的 HTTPS

try 执行`go test ./... -v`时,Golang中有没有办法设置标志

如何动态解析 Go Fiber 中的请求正文?