为了账号安全,请及时绑定邮箱和手机立即绑定

嵌套泛型类型:重用函数的 Type 参数

嵌套泛型类型:重用函数的 Type 参数

Go
qq_遁去的一_1 2023-02-21 12:39:04
给定以下定义:type Collector[T, C any] interface {    Collect(T, C) C}type mapCollector[K comparable, V any] struct {    GetKey func(result V) K}func (m *mapCollector[K, V]) Collect(value V, c *sync.Map) *sync.Map {    c.Store(m.GetKey(value), value)    return c}我正在尝试为mapCollector. 这不起作用func MakeUserMapCollector[K UserId, V User]() *mapCollector[K, V] {    c := mapCollector[K, V]{        GetKey: func(user V) K {            return user.getId()        }    }    return &c}相反,我必须重复func MakeUserMapCollector() *mapCollector[UserId, User] {    c := mapCollector[UserId, User]{        GetKey: func(user User) UserId {            return user.getId()        }    }}有没有办法重用MakeUserMapCollector类型参数在函数中声明类型?
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

您可以创建一个通用构造函数,它接受一个用于“集合”的函数,然后将其传递给您的mapCollector结构。


这看起来像这样:


func MakeUserMapCollector[K comparable, V any](collect func(result V) K) *mapCollector[K, V] {

    return &mapCollector[K, V]{

        GetKey: collect,

    }

}

然后你可以用你的类型作为类型参数和你的“集合”函数调用构造函数:


mc := MakeUserMapCollector[UserId, User](func(result User) UserId { return result.GetId() })

完整示例(Go Playground):


package main


import (

    "fmt"

)


type mapCollector[K comparable, V any] struct {

    GetKey func(result V) K

}


func (m mapCollector[K, V]) Collect(result V) K {

    return m.GetKey(result)

}


type UserId string


type User struct {

    Id UserId

}


func (u User) GetId() UserId {

    return u.Id

}


func MakeUserMapCollector[K comparable, V any](collect func(result V) K) *mapCollector[K, V] {

    return &mapCollector[K, V]{

        GetKey: collect,

    }

}


func main() {

    u := User{

        Id: "12",

    }


    mc := MakeUserMapCollector[UserId, User](func(result User) UserId { return result.GetId() })

    fmt.Println(mc.Collect(u))

}


查看完整回答
反对 回复 2023-02-21
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信