指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

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
}