请教个 golang 自定义 interface 作 函数形参 的问题

2022-12-27 15:06:59 +08:00
 wtfedc

代码如下

package main


type ObjForGroupBy interface {
	GetValueForGroupBy() string
}

func GroupBy(data []ObjForGroupBy) map[string][]ObjForGroupBy {
	var result = make(map[string][]ObjForGroupBy)
	for _, obj := range data {
		strV := obj.GetValueForGroupBy()
		result[strV] = append(result[strV], obj)
	}
	return result
}

type Course struct {
	Day string
}

func (c Course) GetValueForGroupBy() string {
	return c.Day
}


func main() {
	var courses []Course
	courses = append(courses, Course{Day: "Monday"})
	GroupBy(courses)
}

报错为

cannot use courses (variable of type []Course) as type []ObjForGroupBy in argument to GroupBy

搞的我有点懵,是我理解错了 interface 吗?传单数 ObjForGroupBy 的函数,可以正常用,传 slice 就不行。来个朋友指点一下

709 次点击
所在节点    问与答
7 条回复
yleoer
2022-12-27 15:45:56 +08:00
将 `var courses []Course` 改为 `var courses []ObjForGroupBy`。
ripperdev
2022-12-27 15:50:06 +08:00
https://gist.github.com/ripperdev/c91babc583caa2f618b67ee7f483b521
可以用反射实现,不知道大佬们有没有更好的方法
RoninZc
2022-12-27 16:06:18 +08:00
zsj950618
2022-12-27 16:07:47 +08:00
wtfedc
2022-12-27 16:10:46 +08:00
@yleoer 因为要用 Course 结构,来给 courses 灌特定属性的数据,比如{Day:"Monday"},如果 courses 用 ObjForGroupBy 声明,意思就变了,Course 的声明也就多次一举了

@ripperdev 感谢代码援助,考虑到 reflect 是在运行时判断类型结构,性能一般(虽然用不到高性能,纯属意淫),原想着在编译期就把逻辑固定下来,遇到这么个问题
wtfedc
2022-12-27 16:14:48 +08:00
@yleoer 刚反应过来,一语点醒我梦中人,果然可以
lysS
2022-12-27 16:19:32 +08:00
GroupBy 是方法的单参数就行了

```golang

type ObjForGroupBys map[string][]ObjForGroupBy

func (o ObjForGroupBys) GroupBy(obj ObjForGroupBy) {
strV := obj.GetValueForGroupBy()
o[strV] = append(o[strV], obj)
}

```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/904948

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX