登录
首页 >  Golang >  Go问答

Golang 泛型在用作地图元素时不起作用

来源:stackoverflow

时间:2024-04-27 12:12:34 394浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Golang 泛型在用作地图元素时不起作用》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我创建了一个mapkeys泛型和list泛型,但是当将list泛型与普通map[string]list[int]一起使用时,我无法调用泛型的方法,我错了什么?任何想法将不胜感激!

像这样的通用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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())
}

调用此行:

1
yx["one"].Push(10)

收到错误消息:

./prog.go:49:12: 无法调用 list[int] 上的指针方法 push

您可以在此处播放代码


正确答案


list.push() 有指针接收器,但您在映射中存储非指针,并且索引映射不是 addressable。有关详细信息,请参阅 Cannot take the address of map element

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

1
2
3
var yx = make(map[string]*list[int])
yx["one"] = &list[int]{}
yx["one"].push(10)

Go Playground 上尝试一下。

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

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

上面的lst.push(10)(&lst).push(10)的简写。详情请见Pointer methods on non pointer types

以上就是《Golang 泛型在用作地图元素时不起作用》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>