首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套泛型类型:重用函数的类型参数

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

Stack Overflow用户
提问于 2022-09-26 18:02:06
回答 1查看 70关注 0票数 0

鉴于以下定义:

代码语言:javascript
复制
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编写一个模板化的make函数。这不管用

代码语言:javascript
复制
func MakeUserMapCollector[K UserId, V User]() *mapCollector[K, V] {
    c := mapCollector[K, V]{
        GetKey: func(user V) K {
            return user.getId()
        }
    }
    return &c
}

相反,我不得不重复

代码语言:javascript
复制
func MakeUserMapCollector() *mapCollector[UserId, User] {
    c := mapCollector[UserId, User]{
        GetKey: func(user User) UserId {
            return user.getId()
        }
    }
}

是否有方法重用MakeUserMapCollector类型参数来声明函数中的类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-27 00:05:31

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

看起来是这样的:

代码语言:javascript
复制
func MakeUserMapCollector[K comparable, V any](collect func(result V) K) *mapCollector[K, V] {
    return &mapCollector[K, V]{
        GetKey: collect,
    }
}

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

代码语言:javascript
复制
mc := MakeUserMapCollector[UserId, User](func(result User) UserId { return result.GetId() })

完整示例(围棋游乐场):

代码语言:javascript
复制
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))
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73858175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档