interface非常好用,相当于一个空类型,什么类型都可以被它接受,可以说在传参上是非常方便的,那问题来了,什么类型它都能转得回去吗,结果是不能的。

这个问题,我自己碰到了两次,每次都没记录,每次都很干脆的忘了。

一个API接口上可以接受好几个结构体数组,我使用interface来进行接受,此时我使用断言来进行类型转换,很显然无法成功进行断言。

这个问题呢,我们先看看官方对interfaceSlice做出的一个解释。

https://github.com/golang/go/wiki/InterfaceSlice

也可以看此篇博客的中文,和原文大概意思相同,建议两篇都看,毕竟原文才是官方的原意。

https://www.jianshu.com/p/e0abcbc220a4

其中说的其实是interfaceSlice的问题,这里我们知道了interface的结构组成,再来解决问题。

https://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces-in-go

楼主的问题:

问题

得分最高的回答:

解答

这里我翻译一下:

在Go中,一般语法是不应该隐藏那些复杂或耗费资源的操作的,转换string类型到interface类型算法可以O(1)时间内完成。切片[]string依然可以被视作是一个值(译者:我感觉这里可以将切片看做是一个连续内存的结构来将其视作一个值),转换到interface依然可以在O(1)时间内完成。

此规则有一个例外——就是转换字符串,当转换变量string a,[]byte a或者是[]rune a,虽然算法难度为O(n),但还是可以视作正常操作。

其实到这里就可以解决我们的问题了,interface用断言来做类型转换是官方干脆就没想过要做到那么复杂的程度,若是开发者需要做,可以采用反射来自己去实现这种操作的。

这里贴一个实现过程的帖子:

https://github.com/issue9/conv/blob/master/obj.go#L75

另外,还附上一个对讲解interface断言的博客文章:

Type assertions in Go