我创建了一个MapKeys泛型和List泛型,但是当使用带有Normal map[字符串]List[int]的List泛型时,我不能调用泛型的方法,我哪里错了?我们将非常感谢您的任何 idea !

如下所示的通用代码:

package main

import "fmt"

func MapKeys[K comparable, V any](m map[K]V) []K {
    r := make([]K, 0, len(m))
    for k := range m {
        r = append(r, k)
    }
    return r
}

type List[T any] struct {
    head, tail *element[T]
}

type element[T any] struct {
    next *element[T]
    val  T
}

func (lst *List[T]) Push(v T) {
    if lst.tail == nil {
        lst.head = &element[T]{val: v}
        lst.tail = lst.head
    } else {
        lst.tail.next = &element[T]{val: v}
        lst.tail = lst.tail.next
    }
}

func (lst *List[T]) GetAll() []T {
    var elems []T
    for e := lst.head; e != nil; e = e.next {
        elems = append(elems, e.val)
    }
    return elems
}

func main() {
    var m = map[int]string{1: "2", 2: "4", 4: "8"}

    fmt.Println("keys m:", MapKeys(m))

    _ = MapKeys[int, string](m)

    var yx = make(map[string]List[int])
    yx["one"] = List[int]{}
    yx["one"].Push(10)

    lst := List[int]{}
    lst.Push(10)
    lst.Push(13)
    lst.Push(23)
    fmt.Println("list:", lst.GetAll())
}

拨打这条线路:

yx["one"].Push(10)

收到错误消息:

./pro.go:49:12:无法调用List[int]上的指针方法Push

您可以播放代码here

推荐答案

List.Push()有指针接收器,但您在映射中存储了非指针,并且索引映射不是addressable.有关详情,请参阅Cannot take the address of map element.

将指针存储在 map 中,然后可以在 map 索引结果上调用带有指针接收器的方法:

var yx = make(map[string]*List[int])
yx["one"] = &List[int]{}
yx["one"].Push(10)

Go Playground号公路上试试.

注意:如果值是可寻址的,例如变量,则可以使用指针接收器对非指针值调用方法:

lst := List[int]{}
lst.Push(10)

上面的lst.Push(10)(&lst).Push(10)的简写.有关详细信息,请参见Pointer methods on non pointer types.

Go相关问答推荐

为什么(编码器).EncodeElement忽略";,innerxml";标记?

Websocket服务器实现与x/net库trowing 403

包裹网.Conn导致挂起读取

go grpc:无法导入github.com/golang/protobuf/proto(没有所需的模块提供包github.com/gorang/protobuf-proto)

如何修复 Go 中协议缓冲区定义中重新定义的字段?

如果第一次匹配条件,如何跳过切片中的值

如何根据地址和大小打印字符串

这是泛型的有效用例吗?

为什么docall在singleflight中使用go panic?

Go 中如何调用测试函数?

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

Go cmp - 如何为以 struct 为键的映射定义自定义相等性?

如何在自定义验证函数中获取 struct 名称

golang pic.ShowImage 为什么它不生成图像而是向我发送base64值

Golang - 将 [8] 布尔转换为字节

Go 并发、goroutine 同步和关闭通道

panic :拨号 tcp:在 172.22.64.1:53 上查找 bookstoreDB:没有这样的主机

如何从 tinygo webassembly 目标返回对象

Go:如何通过 GIN-Router 从 AWS S3 将文件作为二进制流发送到浏览器?

如何在 Prometheus 中正确检测区域和环境信息?