相关疑难解决方法(0)

为什么Go中没有泛型?

免责声明:我现在只玩了一天Go,所以很有可能我错过了很多.

有没有人知道为什么在Go中没有真正支持generics/templates/whatsInAName?所以有一个泛型map,但是由编译器提供,而Go程序员不能编写自己的实现.尽管所有关于使Go尽可能正交的讨论,为什么我可以使用泛型类型但不创建新类型?

特别是在涉及函数式编程时,有lambda,甚至是闭包,但是对于缺少泛型的静态类型系统,我如何编写,以及通用的高阶函数,如filter(predicate, list)?好的,链接列表等可以interface{}牺牲类型安全性来完成.

由于对SO/Google的快速搜索没有透露任何见解,所以看起来像仿制药,如果有的话,将作为事后补充添加到Go.我确实相信Thompson比Java家伙更好,但为什么要保持泛型?或者他们是否有计划而尚未实施?

generics functional-programming go

117
推荐指数
3
解决办法
3万
查看次数

我如何解决Go没有参数多态?

我是Go新手,但我读过Go常规不会错过参数多态.每当我尝试学习一门新语言时,我都会使用L99问题列表来进行练习.

即使我尝试写一些像第一个问题一样简单(在Go中将是单个语句,取一个切片的最后一个元素),我将如何将其写为一个接受任何类型切片的函数(使用我上面引用的那个单一语句)返回该切片的最后一个元素?

我认为即使语言没有参数多态,也必须有一些惯用的"Go"方式,以便Go常规声称他们不会错过参数多态.否则,如果示例比例如列表的最后一个元素更复杂,则需要一个函数来为每个类型执行任务.

我错过了什么?

go parametric-polymorphism

18
推荐指数
2
解决办法
2867
查看次数

如何在Go中为不同类型实现容器?

以下代码在Go中实现了一个int列表:

package main

import "fmt"

type List struct {
    Head int
    Tail *List
}

func tail(list List) *List {
    return list.Tail
}

func main() {
    list := List{Head: 1, Tail: 
         &List{Head: 2, Tail:
         &List{Head: 3, Tail:
         nil}}}
    fmt.Println(tail(list).Head)
}
Run Code Online (Sandbox Code Playgroud)

问题是这只适用于int.如果我想要一个列表strings,我需要再次重新实现每个列表方法(例如tail)!这显然不实用,所以,这可以通过使用空接口来解决:

type List struct {
  Head interface{} // Now works for any type!
  Tail *List
}
Run Code Online (Sandbox Code Playgroud)

问题是,1.由于类型转换,这似乎要慢得多,2.它抛弃了类型安全,允许人们键入任何东西:

// This type-checks!
func main() {
    list := List{Head: 123456789 , Tail:
         &List{Head: "covfefe" , Tail: …
Run Code Online (Sandbox Code Playgroud)

generics types interface go

2
推荐指数
1
解决办法
611
查看次数