Golang - 重用地图类型周围结构中的自定义可组合方法

问题描述 投票:0回答:1

在图像所示的示例中,我希望方法 Put 应用于 MappingStringInt,因为它是由 Mapping 组成的。然而,这种情况并非如此。 如果 Mapping 由类型 struct 组成,则 Put 方法将应用于 MappingStringInt。 有没有办法解决这个问题并使图像上的第 20 行正常工作? 谢谢

Golang - Reusing custom composable methods from structs around map type


package main

import "fmt"

type (
    Mapping[K comparable, V any] map[K]V
    MappingStringInt             Mapping[string, int]
)

func (self Mapping[K, V]) Put(key K, value V) Mapping[K, V] {
    self[key] = value
    return self
}
func main() {
    m1 := Mapping[string, int]{"two": 2}
    m1.Put("four", 4) // Works
    fmt.Printf("Mapping(four = %v) %+v \n", m1["four"], m1)

    m2 := MappingStringInt{"two": 2}
    m2.Put("four", 4) // Fails: m2.Put undefined (type MappingStringInt has no field or method Put)
    fmt.Printf("Mapping(four = %v) %+v \n", m2["four"], m2)
}

我尝试使用该方法的参考文献,但没有成功。

go inheritance methods maps composable
1个回答
0
投票

正如评论中提到的Burak Serdar,它不会从类型派生,但您可以将其嵌入到结构中,如下所示:

package main

import (
    "fmt"
)

type (
    Mapping[K comparable, V any] map[K]V

    MappingStringInt struct {
        Mapping[string, int]
    }
)

func (item Mapping[K, V]) Put(key K, value V) {
    item[key] = value
}

func main() {
    m1 := Mapping[string, int]{"two": 2}
    m1.Put("four", 4) // Works
    fmt.Printf("Mapping(four = %v) %+v \n", m1["four"], m1)

    m2 := MappingStringInt{Mapping: Mapping[string, int]{"two": 2}}
    m2.Put("three", 3)
    fmt.Printf("Mapping(four = %v) %+v \n", m2.Mapping["four"], m2)
}
© www.soinside.com 2019 - 2024. All rights reserved.