相关疑难解决方法(0)

在 Go 泛型中,为什么我不能将可比较约束与顺序运算符一起使用?

我正在探索 go 泛型(1.18 beta),并且有与比较两个数值相关的问题(一种接受两个值并返回更大数字的简单方法)。

为此,我正在创建一个涵盖此类型集的自定义数字类型(在函数中getBiggerNumber):

int | int8 | int16 | int32 | int64 | float32 | float64
Run Code Online (Sandbox Code Playgroud)

然而,又添加了一个函数,但这一次没有使用自定义类型,而是使用了comparable内置约束(在函数中getBiggerNumberWithComparable)。

但下面的代码给出了此方法的错误:

“无效操作:无法比较 t1 > t2(运算符 > 未在 T 上定义)”?

知道为什么该>操作不适用于内置的可比较类型吗?

package main

import "fmt"

type numbers interface {
    int | int8 | int16 | int32 | int64 | float32 | float64
}

func getBiggerNumber[T numbers](t1, t2 T) T {
    if t1 > t2 {
        return t1
    }
    return t2
}

func getBiggerNumberWithComparable[T comparable](t1, …
Run Code Online (Sandbox Code Playgroud)

generics go

23
推荐指数
1
解决办法
2万
查看次数

Go 泛型:映射键的类型约束?

在下面的代码中,我定义了一个通用链表。Go1.18 很乐意使用列表的实例作为映射的键。但是,最后一行如果未注释,则无法编译;我收到错误:

Cons[int] 没有实现可比较

是否有一个较弱的类型约束我可以使用来挑选出那些可以用作键的类型,或者这是有意的,还是它是一个编译器错误?

package main

import "fmt"

type List[X any] interface {
    isList()
}

type Cons[X any] struct {
    Data X
    Next List[X]
}

func (Cons[X]) isList() {}

type Nil[X any] struct{}

func (Nil[X]) isList() {}

func id[X comparable](x X) X { return x }

func main() {
    x := Cons[int]{5, Nil[int]{}}
    m := map[List[int]]string{}
    m[x] = "Hi"        // succeeds
    fmt.Println(m[x])  // prints "Hi"
    // fmt.Println(id(x)) // fails
}
Run Code Online (Sandbox Code Playgroud)

generics go comparable type-constraints

4
推荐指数
1
解决办法
6831
查看次数

标签 统计

generics ×2

go ×2

comparable ×1

type-constraints ×1