首页 > 编程笔记 > Go语言笔记 阅读:29

Go语言type关键字的多种用法(附带实例)

在 Go 语言,type 关键字有多种不同的用法,大致可分为两类,分别是类型别名和类型定义。

类型别名是对已有数据类型赋予新命名,如一个孩子在小时候有小名、乳名,上学后用学号或者英文名,这些名字都代表他本人。类型别名主要解决代码升级、迁移中存在的类型兼容性问题。

类型定义是自定义数据类型,但自定义数据类型必须在已有数据类型基础上进行定义,最常见的是类型定义为结构体和接口。

类型别名与类型定义在代码结构上十分相似,两者之间的语法差异如下:
// 类型别名
type name = Type
// 类型定义
type name Type

为了更好地说明类型别名与类型定义的差异,我们通过简单的例子加以说明,代码如下:
package main

import (
   "fmt"
)

// 将string类型取一个别名叫meString
type meString = string

// 将myString定义为string类型
type myString string

func main() {
  // 将s1声明为meString类型
  var s1 meString
  // 查看s1的类型名
  fmt.Printf("s1的数据类型为:string
  %T\n", s1)

  // 将s2声明为myString类型
  var s2 myString
  // 查看s2的类型名
  fmt.Printf("s2的数据类型为:%T\n", s2)
}
运行上述代码,运行结果为:

s1的数据类型为:string
s2的数据类型为:main.myString


从运行结果分析得知:
在实际开发中,通常使用类型定义对一些数据结构进行封装处理,尽管类型定义是以 Go 语言的数据类型为基础的,但在此基础上仍能创建或组合多种复杂的数据类型,示例如下:
package main

import "fmt"

// 定义结构体
type mystruct struct {
   name string
}

// 将mystyle定义为mystruct类型
type mystyle mystruct

func main() {
   // 将s声明为mystyle类型
   var s mystyle
   // 设置属性name的值
   s.name = "Tom"
   // 输出变量s的数据
   fmt.Printf("变量s的数据:%v\n", s)
   // 输出变量s的数据类型
   fmt.Printf("变量s的数据类型:%T\n", s)
}
运行上述代码,运行结果为:

变量s的数据:{Tom}
变量s的数据类型:main.mystyle

分析上述代码,我们能得出以下结论:
1) 使用关键字 type 定义结构体 mystruct,并设置结构体成员 name;然后使用关键字 type 定义类型 mystyle,其数据类型来自结构体 mystruct。

2) 在主函数 main() 中定义变量 s,其数据类型为 mystyle,由变量 s 设置属性 name 的值。

3) 分别使用格式化参数 %v 和 %T 查看变量 s 的数据和类型,数据类型为 mystyle,从输出结果已无法得知 mystyle 的定义过程,从而在某程度上达到代码封装的效果。

相关文章