【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,如需转载请自行联系原作者





相关文章
|
23小时前
|
数据采集 人工智能 搜索推荐
快速入门:利用Go语言下载Amazon商品信息的步骤详解
本文探讨了使用Go语言和代理IP技术构建高效Amazon商品信息爬虫的方法。Go语言因其简洁语法、快速编译、并发支持和丰富标准库成为理想的爬虫开发语言。文章介绍了电商网站的发展趋势,如个性化推荐、移动端优化和跨境电商。步骤包括设置代理IP、编写爬虫代码和实现多线程采集。提供的Go代码示例展示了如何配置代理、发送请求及使用goroutine进行多线程采集。注意需根据实际情况调整代理服务和商品URL。
快速入门:利用Go语言下载Amazon商品信息的步骤详解
|
2天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
38 6
Go语言学习12-数据的使用
|
3天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
9 0
|
3天前
|
存储 缓存 Java
来聊聊go语言的hashMap
本文介绍了Go语言中的`map`与Java的不同设计思想。作者`sharkChili`是一名Java和Go开发者,同时也是CSDN博客专家及JavaGuide项目的维护者。文章探讨了Go语言`map`的数据结构,包括`count`、`buckets指针`和`bmap`,解释了键值对的存储方式,如何利用内存对齐优化空间使用,并展示了`map`的初始化、插入键值对以及查找数据的源码过程。此外,作者还分享了如何通过汇编查看`map`操作,并鼓励读者深入研究Go的哈希冲突解决和源码。最后,作者提供了一个交流群,供读者讨论相关话题。
14 0
|
4天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
17 1
Go语言学习11-数据初始化
|
5天前
|
自然语言处理 安全 Java
速通Go语言编译过程
Go语言编译过程详解:从词法分析(生成token)到句法分析(构建语法树),再到语义分析(类型检查、推断、匹配及函数内联)、生成中间码(SSA)和汇编码。最后,通过链接生成可执行文件。作者sharkchili,CSDN Java博客专家,分享技术细节,邀请读者加入交流群。
22 2
|
5天前
|
Java Linux Go
一文带你速通Go语言基础语法
本文是关于Go语言的入门介绍,作者因其简洁高效的特性对Go语言情有独钟。文章首先概述了Go语言的优势,包括快速上手、并发编程简单、设计简洁且功能强大,以及丰富的标准库。接着,文章通过示例展示了如何编写和运行Go代码,包括声明包、导入包和输出语句。此外,还介绍了Go的语法基础,如变量类型(数字、字符串、布尔和复数)、变量赋值、类型转换和默认值。文章还涉及条件分支(if和switch)和循环结构(for)。最后,简要提到了Go函数的定义和多返回值特性,以及一些常见的Go命令。作者计划在后续文章中进一步探讨Go语言的其他方面。
10 0
|
6天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
14 1
|
6天前
|
Go
|
7天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
135 1