首页 > 后端开发 > Golang > 正文

Golang中的类型别名和类型定义有什么区别 通过示例说明差异

P粉602998670
发布: 2025-08-12 09:31:01
原创
833人浏览过

类型定义创建新类型,不与原类型互换;类型别名等同原类型,可互换。1. 类型定义(type t1 t2)会生成独立类型,不可直接赋值或比较原类型;2. 类型别名(type t1 = t2)仅是名称替换,完全等价原类型;3. 类型定义可绑定方法,而类型别名不可;4. 类型定义用于扩展功能,类型别名常用于简化命名或过渡替换。

Golang中的类型别名和类型定义有什么区别 通过示例说明差异

在Golang中,类型别名(type alias)类型定义(type definition)虽然写法相似,但它们的用途和行为完全不同。理解它们的区别,有助于写出更清晰、安全的代码。

Golang中的类型别名和类型定义有什么区别 通过示例说明差异

类型定义:创建一个全新的类型

当你使用

type MyType OriginalType
登录后复制
这种方式时,你是在定义一个新类型,它和原始类型是不同的类型。

type MyInt int
登录后复制

上面这行代码定义了一个新的类型

MyInt
登录后复制
,底层类型是
int
登录后复制
,但它和
int
登录后复制
不是同一个类型。比如:

立即学习go语言免费学习笔记(深入)”;

Golang中的类型别名和类型定义有什么区别 通过示例说明差异
var a int = 10
var b MyInt = 20

a = b // 编译错误:cannot use b (type MyInt) as type int in assignment
登录后复制

这是因为 Go 是强类型语言,即使两个类型的底层结构一样,只要名字不同,就不能直接赋值或比较。

关键点:

Golang中的类型别名和类型定义有什么区别 通过示例说明差异
  • 类型定义会创建一个独立的新类型
  • 新类型不会自动兼容原类型
  • 可以给新类型添加方法,实现接口等

类型别名:只是换个名字

从 Go 1.9 开始,支持了类型别名,语法是这样的:

type MyIntAlias = int
登录后复制

这种写法表示

MyIntAlias
登录后复制
只是
int
登录后复制
的一个别名,两者完全等价。

var a int = 10
var b MyIntAlias = 20

a = b // 正常赋值,因为它们是同一类型
登录后复制

你可以把它们当作完全一样的东西来用,包括赋值、比较、函数参数等。

通义万相
通义万相

通义万相,一个不断进化的AI艺术创作大模型

通义万相 596
查看详情 通义万相

常见用途:

  • 给复杂类型起个简短的名字,提升可读性
  • 在重构过程中做过渡,逐步替换类型名称

举个例子说明区别

我们来看一个具体的对比示例:

type A int
type B = int

func main() {
    var a A = 10
    var b B = 20

    var i int

    i = a // 错误:A 不能直接赋值给 int
    i = b // 正确:B 是 int 的别名
}
登录后复制

在这个例子中:

  • A
    登录后复制
    是一个新的类型,不能和
    int
    登录后复制
    直接互换
  • B
    登录后复制
    int
    登录后复制
    的别名,可以随意互换

方法绑定上的差异

这也是一个容易出错的地方。如果你尝试为类型别名添加方法,Go 会报错:

type MyIntAlias = int

func (m MyIntAlias) String() string { // 报错:cannot define new methods on non-local type int
    return fmt.Sprintf("%d", m)
}
登录后复制

原因是你其实是在尝试给

int
登录后复制
添加方法,而这是不允许的。

但如果是类型定义就可以:

type MyInt int

func (m MyInt) String() string {
    return fmt.Sprintf("%d", m)
}
登录后复制

这样就能正常编译并调用。


总结一下区别

特性 类型定义 (@@######@@) 类型别名 (@@######@@)
是否新类型
能否与原类型互换
能否绑定方法
常见用途 扩展功能、封装逻辑 简化命名、过渡替换

基本上就这些区别。理解清楚之后,在实际开发中根据需求选择合适的写法就可以了。

type T1 T2
登录后复制
type T1 = T2
登录后复制

以上就是Golang中的类型别名和类型定义有什么区别 通过示例说明差异的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号