章节

8.1 自定义类型

本篇学习 Go 自定义类型的定义、方法绑定与显式类型转换,并能用它表达更清晰的业务语义。

自定义类型

概念说明

自定义类型是用 type 基于已有类型定义出来的新类型。
它和底层类型有相同的存储方式,但在 Go 类型系统里是一个独立类型。

自定义类型常用于给普通值增加业务语义。
例如把 int 包装成 StatusCode,代码里就能看出这个整数代表“状态码”。

语法/规则

  1. 使用 type 新类型名 底层类型 定义自定义类型。
  2. 自定义类型可以绑定方法。
  3. 自定义类型和底层类型不是同一个类型,比较或赋值时通常需要显式转换。
  4. 常量可以声明为自定义类型,便于集中维护业务枚举值。
  5. 自定义类型适合表达业务语义,不适合为了“换名字”而滥用。

语法模板

1
type 新类型名 底层类型

状态码类型示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main

import "fmt"

type StatusCode int // 基于 int 定义一个新的类型

const (
	StatusOK      StatusCode = 0
	StatusInvalid StatusCode = 7
	StatusError   StatusCode = 8
)

func (code StatusCode) Message() string {
	switch code {
	case StatusOK:
		return "success"
	case StatusInvalid:
		return "invalid"
	case StatusError:
		return "error"
	default:
		return "unknown"
	}
}

func main() {
	var rawCode int = 0

	fmt.Println(StatusOK.Message())      // 自定义类型也可以绑定方法
	fmt.Println(int(StatusOK) == rawCode) // 和 int 比较时要先显式转换
}

输出结果:

1
2
success
true

常见错误

  1. 误以为 type StatusCode int 定义出来的类型可以直接当作 int 使用,实际比较时通常需要转换。
  2. 只用 int 表示所有业务码,导致代码里看不出值的含义。
  3. 给简单类型绑定过多方法,让类型承担了超出它本身含义的职责。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字