本文摘自php中文网,作者爱喝马黛茶的安东尼,侵删。
type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef。type又有两种使用方式,一种是类型别名,一种是类型定义,是不是熟悉的C语言(define和typedef)味道?
类型定义
1 2 3 4 5 |
|
类型别名
1 2 |
|
type有如下几种用法:
定义结构体
定义接口
类型定义
类型别名
类型查询
定义结构体
结构体是用户自定义的一种抽象的数据结构,golang中struct类似于java语言中的class, 在程序设计中,有着举足轻重的地位。结构体的用法,将会在struct关键字中详细的介绍。下边来看一下定义一个结构体的语法格式:
1 2 3 4 5 |
|
定义接口
接口相关知识点,将会在interface关键字中详细介绍,下边来看一段定义接口的语法格式:
1 2 3 4 |
|
类型定义
使用类型定义定义出来的类型与原类型不相同,所以不能使用新类型变量赋值给原类型变量,除非使用强制类型转换。下面来看一段示例代码,根据string类型,定义一种新的类型,新类型名称是name:
1 |
|
为什么要使用类型定义呢?
类型定义可以在原类型的基础上创造出新的类型,有些场合下可以使代码更加简洁,如下边示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
输出信息是:
1 2 |
|
上边的示例是类型定义的一种简单应用场合,如果不使用类型定义,那么想要实现上边示例中的功能,应该怎么书写这段代码呢?
1 2 3 4 |
|
exec函数中的参数类型,需要替换成func(str string)了,咋一看去也不复杂,但是假如exec接收一个需要5个参数的函数变量呢?是不是感觉参数列表就会很长了。
1 2 3 |
|
从上边的代码可以发现,exec函数的参数列表可读性变差了。下边再来看看使用类型定义是怎么实现这个功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
类型别名
类型别名这个特性在golang1.9中引入。使用类型别名定义出来的类型与原类型一样,即可以与原类型变量互相赋值,又拥有了原类型的所有方法集。给strng类型取一个别名,别名名称是name:
1 |
|
类型别名与类型定义不同之处在于,使用类型别名需要在别名和原类型之间加上赋值符号(=);使用类型别名定义的类型与原类型等价,而使用类型定义出来的类型是一种新的类型。
如下边示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
这段代码在编译时会出现如下错误:
1 |
|
从错误信息可知,str为字符串类型,不能当做b类型参数传入SayB函数中。而str却可以当做a类型参数传入到SayA函数中。由此可见,使用类型别名定义的类型与原类型一致,而类型定义定义出来的类型,是一种新的类型。
给类型别名新增方法,会添加到原类型方法集中
给类型别名新增方法后,原类型也能使用这个方法。下边请看一段示例代码:
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 |
|
输出信息是:
1 2 3 4 |
|
上边的示例中,S是原类型,T是S类型别名。在给T增加了Hello方法后,S类型的变量也可以使用Hello方法。说明给类型别名新增方法后,原类型也能使用这个方法。从示例中可知,变量t可以赋值给S类型变量s,所以类型别名是给原类型取了一个小名,本质上没有发生任何变化。
类型别名,只能对同一个包中的自定义类型产生作用。举个例子,golang sdk中有很多个包,是不是我们可以使用类型别名,给sdk包中的结构体类型新增方法呢?答案是:不行。请牢记一点:类型别名,只能对包内的类型产生作用,对包外的类型采用类型别名,在编译时将会提示如下信息:
1 |
|
类型查询
类型查询,就是根据变量,查询这个变量的类型。为什么会有这样的需求呢?goalng中有一个特殊的类型interface{},这个类型可以被任何类型的变量赋值,如果想要知道到底是哪个类型的变量赋值给了interface{}类型变量,就需要使用类型查询来解决这个需求,示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
如果使用.(type)查询类型的变量不是interface{}类型,则在编译时会报如下错误:
1 |
|
如果在switch以外地方使用.(type),则在编译时会提示如下错误:
1 |
|
所以,使用type进行类型查询时,只能在switch中使用,且使用类型查询的变量类型必须是interface{}
PHP中文网,有大量免费的Golang入门教程,欢迎大家学习!
以上就是golang type什么意思的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
[go]golang 1.16 中 modules的主要变化更新
更多相关阅读请进入《golang》频道 >>
Go语言101
一个与时俱进的Go编程知识库。