暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Go 语言--用户定义的类型

零点小思随笔 2021-06-24
685

Go 语言允许用户自定义类型。

当用户声明一个新类型时,这个声明就给编译器提供了一个框架,告知必要的内存大小和表示信息。

声明后的类型和内置类型的运作方式类似。

Go 语言里声明用户自定义类型有两种方法:

struct 关键字

使用 struct 关键字是最常用的方法,它可以让用户创建一个结构体类型。

1、 声明一个结构体类型

type User struct {
 Name  string
 Age   int64
 Email string
 Score int64
}

复制
  • 结构体类型的声明以关键字 type 开始,之后是新类型的名字,最后是关键字 struct。

  • 这个结构体类型有 4 个字段,每个字段都是基于一个内置类型。

  • 一旦声明了类型,就可以使用这个类型创建值。

2、使用自定义结构体类型声明变量,并初始化其为零值

// 声明 User 类型的变量
 var user User

复制
  • 关键字 var 创建了类型为 User 且名为 user 的变量。当声明变量时,这个变量对应的值总是会被初始化。
  • 这个值要么用指定的值初始化,要么用零值(即变量类型的默认值)做初始化。对数值类型来说,零值是 0;对字符串来说,零值是空字符串;对 布尔类型,零值是 false.

任何时候,创建一个变量并初始化其为零值,习惯使用关键字 var。这种用法是为了更明确地表示一个变量被设置为零值。

如果变量被初始化为某个非零值,就配合结构体字面量和短变量声明操作符来创建变量,如下所示。

type User struct {
 Name  string
 Age   int64
 Email string
 Score int64
}

func main()  {
 // 声明 User 类型的变量,并初始化所有字段
 oscar := User{
  Name:  "Oscar",
  Age:   20,
  Email: "5834838@qq.com",
  Score: 90,
 }
}

复制

如何声明一个 User 类型的变量,并使用某个非零值作为初始值?

首先定义一个变量名(oscar),之后是短变量声明操作符。这个操作符是冒号加一个等号(:=)。

一个短变量声明操作符在一次操作中完成两件事:声明一个变量,并初始化。

短变量操作符会使用右侧给出的类型信息作为声明变量的类型。

既然要创建并初始化一个数据类型,就要使用结构体字面量来完成这个初始化。结构体字面量使用一对大括号括住内部字段的初始值。

结构体字面量可以对结构体类型采用两种形式:

1、使用结构体字面量创建结构体类型的值

User{
  Name:  "Oscar",
  Age:   20,
  Email: "5834838@qq.com",
  Score: 90,
 }

复制
  • 这种形式对字段的声明顺序没有要求。

2、不使用字段名创建结构体类型的值

lisa := User{"Oscar", 22, "343664563@qq.com", 88}

复制
  • 这种形式值的顺序很重要,必须要和结构体中声明的字段顺序一致。

当声明结构体类型时,字段类型并仅限于内置类型,也可以使用其他用户定义的类型。

// 声明Admin 类型的变量
 admin := Admin{
    // User 类型的字段
  person: User{
     Name:  "Oscar",
     Age:   18,
     Email: "456776@qq.com",
     Score: 70,
  },
  level:  "super",
 }

复制

另外一种声明用户定义的类型的方法是基于一个已有的类型,将其作为新类型的类型说明。当需要一个可以用已有类型表示的新类型的时候,这种方法会非常好用。

  • 基于 int64 声明一个新类型
type Duration int64

复制

这是标准库 time 包里的一个类型声明。Duration 是一种描述时间间隔的类型,单位是纳秒(ns)。这个类型使用内置的 int64 类型作为其代表。在 Duration 类型声明中,把 int64 类型叫做 Duration 的基础类型,虽然 int64 是基础类型,Go 并不认为 Duration 和 int64 是同一种类型,Duration 类型依然是一个独立的类型,两种不同类型的值即便相互兼容,也不能相互赋值,编译器不会对不同类型的值做隐式转换。


文章转载自零点小思随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论