自定义类型

前面我们已经学习了不少基础和高级数据类型,在 Go 语言里面,我们还可以通过自定义类型来表示一些特殊的数据结构和业务逻辑。

使用关键字 type 来声明:

  1. type NAME TYPE

声明语法

  • 单次声明
  1. type City string
  • 批量声明
  1. type (
  2. B0 = int8
  3. B1 = int16
  4. B2 = int32
  5. B3 = int64
  6. )
  7. type (
  8. A0 int8
  9. A1 int16
  10. A2 int32
  11. A3 int64
  12. )

简单示例

  1. package main
  2. import "fmt"
  3. type City string
  4. func main() {
  5. city := City("上海")
  6. fmt.Println(city)
  7. }

基本操作

  1. package main
  2. import "fmt"
  3. type City string
  4. type Age int
  5. func main() {
  6. city := City("北京")
  7. fmt.Println("I live in", city + " 上海") // 字符串拼接
  8. fmt.Println(len(city)) // len 方法
  9. middle := Age(12)
  10. if middle >= 12 {
  11. fmt.Println("Middle is bigger than 12")
  12. }
  13. }

总结: 自定义类型的原始类型的所有操作同样适用。

函数参数

  1. package main
  2. import "fmt"
  3. type Age int
  4. func main() {
  5. middle := Age(12)
  6. printAge(middle)
  7. }
  8. func printAge(age int) {
  9. fmt.Println("Age is", age)
  10. }

当我们运行代码的时候会出现 ./main.go:11:10: cannot use middle (type Age) as type int in argument to printAge 的错误。

因为 printAge 方法期望的是 int 类型,但是我们传入的参数是 Age,他们虽然具有相同的值,但为不同的类型。

我们可以采用显式的类型转换( printAge(int(primary)))来修复。

不同自定义类型间的操作

  1. package main
  2. import "fmt"
  3. type Age int
  4. type Height int
  5. func main() {
  6. age := Age(12)
  7. height := Height(175)
  8. fmt.Println(height / age)
  9. }

当我们运行代码会出现 ./main.go:12:21: invalid operation: height / age (mismatched types Height and Age) 错误,修复方法使用显式转换:

  1. fmt.Println(int(height) / int(age))