给 interface{} 起别名
在 go 程序里,interface{} 是常用的类型。即使会加入泛型,它仍然有需要用到的地方,例如需要运行期反射的场景。
最近在新项目里我都会用到下面的别名定义
type (
any = interface{}
dyn = interface{}
)
any 表示任意类型,用于需要做 type assertion 的场景。 例如容器类型,或者枚举类型。用泛型可以替代 any。
dyn 表示动态类型,用于需要做 reflect 的场景。 这些场景是泛型不能替代的,例如动态调用、赋值等。
使用这些别名,一来比较简短,二来语义可以更清晰。
类型别名在另外一些场景,也可以起到简化代码的作用,例如
type M = map[string]any
M 是 string 到 any 的映射,在写嵌套的结构的字面量时,可以让代码简洁一些
var jsonData = M{
"foo": M{
"bar": M{
"baz": []M{
{
"quux": 42,
},
},
},
},
"ok": true,
}
如果不用别名,而是用 map[string]interface{},就相当冗长了。
虽然类型别名的初衷并不是简化代码,而是方便重构,但既然具备上面所述的几个优点,那就可以用。
2019-08-04
comments powered by Disqus