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关键字相关推荐

  1. c语言中ANSI标准的关键字,C语言中32个关键字详解

    C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...

  2. c语言程序关键字是什么,C语言中32个关键字详解

    C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...

  3. c语言中extern关键字_了解C语言中的extern关键字

    c语言中extern关键字 In this article, we'll take a look at understanding the extern keyword in C. 在本文中,我们将了 ...

  4. C语言中printf是不是关键字,C语言中printf是什么意思

    换行. printf("\n")表示输出换行符,"\n"是个转义字符,系统识别到转义字符时会自动换行.窗口是不会显示\n的,会直接换到下一行. 在不同的语言中, ...

  5. c语言4钟存储类型关键字用法,求C语言中的32个关键字及其意思? C语言中32个关键字的意思和用法~!...

    C语言中的32个关键字及其意思如下: 1.auto    声明自动变量 2.short    声明短整型变量或函数 3.int    声明整型变量或函数 4.long    声明长整型变量或函数 5. ...

  6. 简述C语言中32个关键字

    在C语言中,一共有32个关键字,这些关键字我们可以将其非为两类:分别是数据类型关键字和流程控制类关键字.其中数据类关键字又可以分为A基本数据类型(5个).B类型修饰关键字(4个).C复杂类型关键字(5 ...

  7. python global函数_如何使用python语言中的global关键字获取函数值

    在python语言中,如果在函数外层定义了一个全局变量a,函数内部又有一个同名的局部变量,想要这个全局变量的值改成为局部变量的值,可以使用global.下面利用一个实例说明如何实现这个场景,操作如下: ...

  8. C语言中的extern关键字用法

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用". 1. extern修饰变量的声明.举例来说,如果文件a.c需要引用b ...

  9. java千面编程,一人千面:谈谈Go语言中的type

    世界是复杂的.一个人.一个事物可以有多样的特性,而多个人多个事物又可以表现出一致的特性:从微观角度说,即具体到个体时,要求这个个体是多功能的多样性的,能够完成越多的功能具有越多的特性越好.比如一个人可 ...

最新文章

  1. 2020-08-20 CountVectorizer 包含示例 API
  2. Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法
  3. 深入理解 SVG 系列(一) —— SVG 基础
  4. 鸟哥的Linux私房菜(基础篇)- 附录 A: GNU 的 GPL 条文 version 2
  5. LeetCode 2194. Excel 表中某个范围内的单元格
  6. 三类MySQL_Mysql中的三类锁,你知道吗?
  7. JSON使用时,注意0件和空。
  8. webstorm更换主题后快捷键失效
  9. 单片机外文参考文献期刊_求有关单片机的中英文参考文献
  10. Premiere Pro 2022安装教程(附详细图文教程)
  11. 仿站和模板建站的区别_快速仿站工具,全能扒站助手
  12. drozer工具介绍和使用
  13. 目标检测论文解读复现之十四:一种基于残差网络优化的航拍小目标检测算法
  14. 2011最犀利语录大全
  15. 【您有一封来自阿里云的邀请函】阿里云成都客户服务中心20+职位虚席以待,来吧,成就最好的自己!...
  16. print spooler打印服务启动后,自动停止的解决方法。
  17. 【设计模式】模板模式——jdbc案例
  18. Jquery入门指南教程
  19. Pytorch学习之cuda
  20. 跨平台工具详解:Netbiscuits (Kony solutions的竞争对手)

热门文章

  1. 飞塔防火墙常用命令集合
  2. 最先进的Git分布式仓库系统——是如何提升编程效率的?
  3. SPARK 笔记 (五) 经纬度转换地址
  4. jq 点击按钮跳转到微信_实现点击复制微信号并自动打开微信加好友
  5. w ndows7安不上HP1020,Win7安装hp1020打印机后无法使用怎么办(图文)
  6. 希尔伯特:无穷小是理想元素
  7. 哈工大(HIT)计算机网络 翻转课堂 实验 mooc答案 总结
  8. 基于局部自适应色差阈值的彩色图像边缘检测_爱学术
  9. Javaweb使用dom4j解析xml文档的一般姿势
  10. 第二十二篇玩转【斗鱼直播APP】系列之弹出房间界面