章节

8.2 类型别名

本篇学习类型别名与自定义类型的区别,并能判断什么时候应该使用别名。

类型别名

概念说明

类型别名使用 type 新名字 = 原类型 定义。
它不会创建一个全新的类型,只是给已有类型增加一个别名。

它和自定义类型最容易混淆:
自定义类型是新类型,类型别名仍然是原类型。

语法/规则

  1. 类型别名语法中间有等号:type Alias = 原类型
  2. 类型别名不会产生新类型,打印类型时通常仍显示原类型。
  3. 类型别名可以和原类型直接比较或赋值。
  4. 类型别名不适合用来给内置类型新增方法。
  5. 类型别名常用于重构、迁移包路径或兼容旧名称。

类型别名与自定义类型对比示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

type AliasCode = int // 类型别名,本质上还是 int
type StatusCode int  // 自定义类型,是一个新类型

const (
	OK      StatusCode = 0
	AliasOK AliasCode  = 0
)

func (code StatusCode) Message() string {
	return "success"
}

func main() {
	var rawCode int = 0

	fmt.Printf("%T %T\n", OK, AliasOK) // 对比自定义类型和别名的实际类型
	fmt.Println(AliasOK == rawCode)     // 别名可直接和原类型比较
	fmt.Println(int(OK) == rawCode)     // 自定义类型通常要先转换
	fmt.Println(OK.Message())
}

输出结果:

1
2
3
4
main.StatusCode int
true
true
success

常见错误

  1. type Alias = int 当成“新类型”使用,实际它仍然是 int
  2. 忘记类型别名语法中的 =,导致定义成自定义类型。
  3. 试图通过内置类型别名给内置类型新增方法,通常无法达到预期。
  4. 为了让变量名更“好看”而滥用类型别名,反而降低代码可读性。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字