首页 > golang > 【Go语言】【4】GO语言类型和为类型增加方法
2018
01-28

【Go语言】【4】GO语言类型和为类型增加方法

一、GO语言的类型

GO语言中内置了如下基础类型:

整型:byte(int8)、int16、int、uint等

浮点型:float32、float64

复数类型:complex64、complex128

布尔类型:bool

字符类型:rune

字符串:string

错误类型:error

同时GO语言也支持下面的复合类型:

指针

数组

切片:slice

集合:map

通道:chan

结构体:struct

接口:interface


上看下看左看右看,怎么没有看到double类型呢?同时还有几个陌生的面孔,像rune、error、slice、chan等,呵呵,GO的确没有提供double类型,它认为浮点类型足够表达double的范围,所以就把double取消了;

另外,整型也进行了划分,像int8、int16、int、uint、uintptr等,其中int8与byte是等价的,可以认为byte是int8的别名,对了,给类型取别名可是GO的特别本事哟~~~


1、按Java习惯先创建workspace目录,我把这个workspace放到了GOROOT环境变量下,里面分别再创建src、bin、pkg三个目录

2、打开Sublime text,选择“File > Open Folder...”

【Go语言】【4】GO语言类型和为类型增加方法_Go

3、在弹出的窗口中选择workspace目录

【Go语言】【4】GO语言类型和为类型增加方法_类型_02

4、在Sublime text中输入如下代码

package main


import "fmt"


type intNick int //为int取个intNick别名


func main() {

     var a intNick

     fmt.Println(a)

}

【Go语言】【4】GO语言类型和为类型增加方法_类型_03

5、选择“File > Save with Encoding > UTF-8”,文件名取为“nick.go”

6、type intNick int表示为int取了一个别名,叫intNick

  var a intNick表示定义一个变量a,它的类型是intNick,缺省值为0

  fmt.Println(a)表示输出变量a的值

7、按ctrl + b,输入go run nick.go后回车,可以看到运行结果:输出0,耗时1.0231298秒

【Go语言】【4】GO语言类型和为类型增加方法_类型_04


二、为类型增加方法 

在上面的例子其实不仅仅是取一个别名,而是重新定义了一个类型,我们可以为这个全新的类型增加方法

1、在nick.go中增加如下代码

/**

 * 为intNick类型增加一个isLessThanParam的方法

 */

func (nick intNick) isLessThanParam(param intNick) bool {

return nick < param

}

【Go语言】【4】GO语言类型和为类型增加方法_增加方法_05

2、GO语言的方法定义

func methodname(param1 paramType1, param2 paramType2) (result1 resultType1, result2 resultType2){

    //...略

}

其中func是方法修饰符

methodname是方法名

param1param2是方法入参

paramType1paramType2是方法入参的参数

result1result2是返回值

resultType1resultType2是返回值的类型


【备注】:

GO语言比较有意思的是,它可以返回多个值,这点是程序员一直梦寐以求的,但其它语言所不支持的


在《[3]GO语言常量与变量》中曾经说过:GO语言很符合人的正常思维,代码想怎么写就怎么写,无论怎么写都符合GO的语法。

2.1 假如param1和param2的类型一样,都是paramType,那么很自然地可以把方法简写为

func methodname(param1,param2 paramType) (result1 resultType1, result2 resultType2){

    //...略

}

2.2 假如result1和result2的类型一样,都是resultType,那么方法还可以简写为

func methodname(param1, param2 paramType) (result1, result2 resultType){

    //...略

}

2.3 假如参数和返回值只有一个,那么方法可以简写为

func methodname(param paramType) (result resultType){

    //...略

}

2.4 既然只有一个返回值,直接返回一个返回值的类型就得了,那么方法可以简写为

func methodname(param paramType) resultType{

    //...略

}

以上表达方式都是正确的,所以GO语言是简约而不简单

3、为类型增加的方法与一般方法的区别

在2中介绍了GO语言是怎么定义方法的,那么我们为定义的全新类型增加的方法与一般方法的区别在什么地方呢?

  • 为类型增加方法:

func (nick intNick) isLessThanParam(param intNick) boolean {

   return nick < param

}

  • 一般方法:

func methodname(param paramType) resultType{

   //...略

}

明眼人一下就看出来了——在方法名前增加了(nick intNick),这表示该方法是用于nick对象的nick对象的类型为intNick

所以在main中使用该方法时就可以参照面向对象的方式进行编码了:

// 定义对象a,对象是intNick类型的对象。这就像有一个Integer类,它的实例是a

var a intNick = 8

// 调用对象a的isLessThanParam()方法

a.isLessThanParam(9)


4、GO到底是面向过程的,还是面向对象的,还是面向函数的?

这是一个很好的话题,在我看来它都有,在51cto的视频教学中,无闻老师提及到了GO是面向类型的编程,很精辟的一个归纳。

5、修改main方法

func main() {

    var a intNick = 8

    fmt.Println(a.isLessThanParam(9))

}

【Go语言】【4】GO语言类型和为类型增加方法_类型_06

6、按ctrl + b,输入go run nick.go后回车,可以看到运行结果:输出true

【Go语言】【4】GO语言类型和为类型增加方法_Go_07


三、题外话

1、尽管byte是int8的别名,但在常规的开发过程中,还是建议不要用int8指定变量的类型,这样容易导致移植困难

2、GO语言对代码的排列方式也进行了语法级别的检查,动手编写上面的代码会发现,函数定义时花括号必须在这一行的后面,如果把花括号新起一行,则会出现unexpected semicolon or newline before {错误,如下:

func (nick intNick) isLessThanParam(param intNick) bool 

{

    return nick < param

}


【Go语言】【4】GO语言类型和为类型增加方法_增加方法_08


作者:golang中国
golang中国

本文》有 5403 条评论

留下一个回复