【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...”

wKioL1TiAcDQHJH6AAG7seiSLsU427.jpg

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

wKiom1TiASHB-a3sAAJ2KHXpeq8293.jpg

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

package main


import "fmt"


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


func main() {

     var a intNick

     fmt.Println(a)

}

wKioL1TiAy-CFkzTAAH9UYHlkeY812.jpg

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秒

wKiom1TiBRrz-3H3AAIKv42L1Xw211.jpg


二、为类型增加方法 

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

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

/**

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

 */

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

return nick < param

}

wKiom1TiCKWREQZ6AAJNmWu_GUM836.jpg

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))

}

wKiom1TiEHWQtr61AAKOsAf9V0U172.jpg

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

wKiom1TiELPiMFxSAAJ0QoVo-rg843.jpg


三、题外话

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

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

func (nick intNick) isLessThanParam(param intNick) bool 

{

    return nick < param

}


wKioL1TiEzuyC-yRAALIMKDdl3M070.jpg




     本文转自qingkechina 51CTO博客,原文链接:http://blog.51cto.com/qingkechina/1614711,如需转载请自行联系原作者





相关文章
|
2月前
|
JSON 安全 前端开发
类型安全的 Go HTTP 请求
类型安全的 Go HTTP 请求
|
12天前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
2月前
|
安全 Go
|
2月前
|
存储 安全 程序员
|
2月前
|
编译器 Go 开发者
Go 在编译时评估隐式类型的优点详解
【8月更文挑战第31天】
26 0
|
2月前
|
存储 编译器 Go
|
2月前
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
13 0
|
存储 JSON API
Go语言:RESTful API 服务,急速入门!
REST即表述性状态传递(英文:Representational State Transfer,简称REST),它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性
484 0
Go语言:RESTful API 服务,急速入门!
|
安全 编译器 Go
Go语言,Protobuf 入门详解!
Protobuf 是 Protocol Buffers 的简称,是一种与语言、平台无关,可扩展的序列化结构化数据的数据描述语言,Protobuf作为接口规范的描述语言,可以作为设计安全的跨语言PRC接口的基础工具。
339 0
Go语言,Protobuf 入门详解!
|
机器学习/深度学习 前端开发 Java
go语言可以做什么?入门Go语言
go语言可以做什么?入门Go语言
147 0