-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46569
- shell命令
-
- 文章:(42)篇
- 阅读:154246
- Git教程
-
- 文章:(36)篇
- 阅读:234885
- leetCode刷题
-
- 文章:(76)篇
- 阅读:131875
-
Go中type的使用2018-04-25 15:31 阅读(5080) 评论(0)
一、概述
在go语言中,type是一个相当重要的关键字,它可以进行如下操作:
1、新类型的定义
2、结构体的定义
3、接口的定义
4、类型别名的定义
5、类型查询
二、新类型的定义
新类型的定义,格式如下:
type newType baseType
即baseType为基础类型,创建一个新类型newType,如下:
type myInt int var nums myInt = myInt(10)
注意,由于go语言是强类型的静态语言,所以myInt和int,尽管存储的范围相同,但是它们之间也不能相互赋值,只能经过类型转换。如下:
var num2 int= int(nums) var num3 int= nums //将会报错cannot use nums (type myInt) as type int in assignment
那么,basetype可以为哪些类型呢?
baseType,不仅仅可以使用go语言中的内置类型,如布尔类型、整型、浮动型、复数类型、字符、字符串、指针、数组、切片、字典、通道、结构体、接口,还可以是函数类型。
1、定义一个函数类型,用来当形参,如下:
type DoAction func(student Student) error//将DoAction定义为函数类型 func showStuName(f DoAction, s Student) { f(s) }
是不是看着比较简洁呢?下面在来一个案例
2、给函数变量定义方法
既然函数可以通过type来申明为函数变量,那么,我们就可以为该变量添加方法。如下:
type DoAction func(student Student) error //将DoAction定义为函数类型 func (f DoAction) doSomething(s Student) { //为该类型创建一个方法,同时调用对应的方法 f(s) }
为函数申明方法有作用是什么?看下面的使用
type Student struct { name string } func sayHello(s Student) error { fmt.Println("hello world") return nil } func showName(s Student) error { fmt.Println("my name is", s.name) return nil } s := Student{name: "findme"} doType := 1 //当前操作类型 var p DoAction switch doType { case 1: p = DoAction(sayHello) case 2: p = DoAction(showName) } p.doSomething(s)
可以看到,在实例化DoAction类型(即函数类型)的时候,我们传递了不同的函数,可以实现类似“多态”的效果。
三、结构体的定义
结构体的定义,比较简单,格式如下:
type name struct { Field1 type Field2 type Field3 type }
四、接口的定义
接口的定义,和结构体有点类似,只是把struct换成了interface关键字,格式如下:
type name interface{ method1() method2() }
五、别名的定义
注意区分别名的定义和新类型的定义,别名定义格式如下:
type aliasType = baseType
比新类型的定义多了一个“=”,那么和新类型定义有什么区分呢?
(1)在上面提到过,新类型定义,newType和baseType类型的变量,是不能相互赋值和运算的,需要经过强制转换,因为他们的静态类型不同。
但是,别名定义,aliasType和baseType类型的变量,确实可以相互赋值和运算的。
type myInt = int var nums1 myInt = myInt(10) var nums2 int = nums1 //是合法的
(2)关于别名,还有一个需要我们注意的地方是。由于go语言,不能为简单的内置类型,添加方法,所以当我们为简单的内置类型(比如int、string、bool),添加别名的时候,是不能够为其添加方法的。如下:
type myInt = int func (this myInt) show() { fmt.Println(this) } var s myInt = myInt(3) s.show()
上面的程序,将报错:
cannot define new methods on non-local type int
type int has no field or method show
如果新类型的定义,就不会有这个问题。
六、类型查询
通过type,我们可以检查变量的类型,但是很遗憾的是,只能在switch中才能使用,否则就会报错:
use of .(type) outside type switch
此外,变量还必须是interface{}类型,否则会报错:
var nums1 int = myInt(10) switch v := nums1.(type) { ... }
cannot type switch on non-interface value nums1 (type int)
正确的使用,如下:
var nums1 interface{} = myInt(10) switch v := nums1.(type) { case int: fmt.Println("int") case string: fmt.Println("string") default: fmt.Println("其他", v) }