golang类型别名与类型定义的区别:
类型别名 是 Go 1.9 版本添加的新功能。至于为什么要添加这个功能,官方文档:https://go.dev/talks/2016/refactor.article 有说明,简单来说就是:为了在代码库重构期间实现逐步的代码修复,必须能够为常量、函数、变量或类型创建替代名称。
类型别名的语法:
type OldAPI = NewPackage.API
类型定义的语法:
type OldAPI NewPackage.API
这俩的最大区别是,类型别名和源类型是相同的,可以直接使用,以及源类型自有的属性和方法,不允许自定义源类型没有的属性和方法;而类型定义 会生成一个新的类型和从语法上是不相等的,不能用于赋值 比较等操作
比如下面,主要是为了实现对time的格式化输出:
type JsonTime = time.Time
func (j JsonTime) MarshalJSON() ([]byte, error) { //这里就会报: Cannot define new methods on the non-local type 'time.Time'
var stamp = fmt.Sprintf(`"%s"`, time.Time(j).Format("2006-01-02 15:04:05"))
return []byte(stamp), nil
}
所以就需要通过类型定义来实现这个功能:
type JsonTime time.Time // 把 = 号去掉
func (j JsonTime) MarshalJSON() ([]byte, error) {
var stamp = fmt.Sprintf(`"%s"`, time.Time(j).Format("2006-01-02 15:04:05"))
return []byte(stamp), nil
}
