go语言中的type关键字
type关键字
type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef。搞清楚type的使用,就容易理解go语言中的核心概念struct、interface、函数等的使用。
一、类型定义
1.1 定义结构体
使用type 可以定义结构体类型:
//1、定义结构体
//结构体定义
type person struct {name string //注意后面不能有逗号age int
}
1.2 定义接口
使用type 可以定义接口类型:
type USB interface {start()end()
}
1.3 定义其他的新类型
使用type,还可以定义新类型。
语法:
type 类型名 Type
示例代码:
package mainimport "fmt"type myint int
type mystr stringfunc main() {var i1 myintvar i2 = 100i1 = 100fmt.Println(i1)//i1 = i2 //cannot use i2 (type int) as type myint in assignmentfmt.Println(i1,i2)var name mystrname = "王二狗"var s1 strings1 = "李小花"fmt.Println(name)fmt.Println(s1)name = s1 //cannot use s1 (type string) as type mystr in assignment
}
1.4 定义函数的类型
Go语言支持函数式编程,可以使用高阶编程语法。一个函数可以作为另一个函数的参数,也可以作为另一个函数的返回值,那么在定义这个高阶函数的时候,如果函数的类型比较复杂,我们可以使用type来定义这个函数的类型:
package mainimport ("fmt""strconv"
)func main() {res1 := fun1()fmt.Println(res1(10,20))
}type my_fun func (int,int)(string)//fun1()函数的返回值是my_func类型
func fun1 () my_fun{fun := func(a,b int) string {s := strconv.Itoa(a) + strconv.Itoa(b)return s}return fun
}
二、类型别名
类型别名的写法为:
type 别名 = Type
类型别名规定:TypeAlias 只是 Type 的别名,本质上 TypeAlias 与 Type 是同一个类型。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。
类型别名是 Go 1.9 版本添加的新功能。主要用于代码升级、迁移中类型的兼容性问题。在 C/C++语言中,代码重构升级可以使用宏快速定义新的一段代码。Go 语言中没有选择加入宏,而是将解决重构中最麻烦的类型名变更问题。
在 Go 1.9 版本之前的内建类型定义的代码是这样写的:
type byte uint8
type rune int32
而在 Go 1.9 版本之后变为:
type byte = uint8
type rune = int32
这个修改就是配合类型别名而进行的修改。
示例代码:
package mainimport ("fmt"
)func main() {var i1 myintvar i2 = 100i1 = 100fmt.Println(i1)//i1 = i2 //cannot use i2 (type int) as type myint in assignmentfmt.Println(i1,i2)var i3 myint2i3 = i2fmt.Println(i1,i2,i3)}type myint int
type myint2 = int //不是重新定义类型,只是给int起别名
三、非本地类型不能定义方法
能够随意地为各种类型起名字,是否意味着可以在自己包里为这些类型任意添加方法?
package main
import ("time"
)
// 定义time.Duration的别名为MyDuration
type MyDuration = time.Duration
// 为MyDuration添加一个函数
func (m MyDuration) EasySet(a string) { //cannot define new methods on non-local type time.Duration
}
func main() {}
以上代码报错。报错信息:cannot define new methods on non-local type time.Duration
编译器提示:不能在一个非本地的类型 time.Duration 上定义新方法。非本地方法指的就是使用 time.Duration 的代码所在的包,也就是 main 包。因为 time.Duration 是在 time 包中定义的,在 main 包中使用。time.Duration 包与 main 包不在同一个包中,因此不能为不在一个包中的类型定义方法。
解决这个问题有下面两种方法:
- 将类型别名改为类型定义: type MyDuration time.Duration,也就是将 MyDuration 从别名改为类型。
- 将 MyDuration 的别名定义放在 time 包中。
四、在结构体成员嵌入时使用别名
当类型别名作为结构体嵌入的成员时会发生什么情况?
package mainimport ("fmt"
)type Person struct {name string
}func (p Person) Show() {fmt.Println("Person-->",p.name)
}//类型别名
type People = Persontype Student struct {// 嵌入两个结构PersonPeople
}func (p People) Show2(){fmt.Println("People------>",p.name)
}func main() {//var s Student//s.name = "王二狗" //ambiguous selector s.names.People.name = "李小花"s.Person.name = "王二狗"//s.Show() //ambiguous selector s.Shows.Person.Show()s.People.Show2()fmt.Printf("%T,%T\n",s.Person,s.People) //main.Person,main.Person}
在通过s直接访问name的时候,或者s直接调用Show()方法,因为两个类型都有 name字段和Show() 方法,会发生歧义,证明People 的本质确实是Person 类型。
go语言中的type关键字相关推荐
- c语言中ANSI标准的关键字,C语言中32个关键字详解
C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...
- c语言程序关键字是什么,C语言中32个关键字详解
C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...
- c语言中extern关键字_了解C语言中的extern关键字
c语言中extern关键字 In this article, we'll take a look at understanding the extern keyword in C. 在本文中,我们将了 ...
- C语言中printf是不是关键字,C语言中printf是什么意思
换行. printf("\n")表示输出换行符,"\n"是个转义字符,系统识别到转义字符时会自动换行.窗口是不会显示\n的,会直接换到下一行. 在不同的语言中, ...
- c语言4钟存储类型关键字用法,求C语言中的32个关键字及其意思? C语言中32个关键字的意思和用法~!...
C语言中的32个关键字及其意思如下: 1.auto 声明自动变量 2.short 声明短整型变量或函数 3.int 声明整型变量或函数 4.long 声明长整型变量或函数 5. ...
- 简述C语言中32个关键字
在C语言中,一共有32个关键字,这些关键字我们可以将其非为两类:分别是数据类型关键字和流程控制类关键字.其中数据类关键字又可以分为A基本数据类型(5个).B类型修饰关键字(4个).C复杂类型关键字(5 ...
- python global函数_如何使用python语言中的global关键字获取函数值
在python语言中,如果在函数外层定义了一个全局变量a,函数内部又有一个同名的局部变量,想要这个全局变量的值改成为局部变量的值,可以使用global.下面利用一个实例说明如何实现这个场景,操作如下: ...
- C语言中的extern关键字用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用". 1. extern修饰变量的声明.举例来说,如果文件a.c需要引用b ...
- java千面编程,一人千面:谈谈Go语言中的type
世界是复杂的.一个人.一个事物可以有多样的特性,而多个人多个事物又可以表现出一致的特性:从微观角度说,即具体到个体时,要求这个个体是多功能的多样性的,能够完成越多的功能具有越多的特性越好.比如一个人可 ...
最新文章
- 2020-08-20 CountVectorizer 包含示例 API
- Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法
- 深入理解 SVG 系列(一) —— SVG 基础
- 鸟哥的Linux私房菜(基础篇)- 附录 A: GNU 的 GPL 条文 version 2
- LeetCode 2194. Excel 表中某个范围内的单元格
- 三类MySQL_Mysql中的三类锁,你知道吗?
- JSON使用时,注意0件和空。
- webstorm更换主题后快捷键失效
- 单片机外文参考文献期刊_求有关单片机的中英文参考文献
- Premiere Pro 2022安装教程(附详细图文教程)
- 仿站和模板建站的区别_快速仿站工具,全能扒站助手
- drozer工具介绍和使用
- 目标检测论文解读复现之十四:一种基于残差网络优化的航拍小目标检测算法
- 2011最犀利语录大全
- 【您有一封来自阿里云的邀请函】阿里云成都客户服务中心20+职位虚席以待,来吧,成就最好的自己!...
- print spooler打印服务启动后,自动停止的解决方法。
- 【设计模式】模板模式——jdbc案例
- Jquery入门指南教程
- Pytorch学习之cuda
- 跨平台工具详解:Netbiscuits (Kony solutions的竞争对手)