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

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

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

package main

import "fmt"

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

func main() {     var a intNick     fmt.Println(a)}

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秒

二、为类型增加方法

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

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

/** * 为intNick类型增加一个isLessThanParam的方法 */func (nick intNick) isLessThanParam(param intNick) bool {	return nick < param}

2、GO语言的方法定义

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

//...略

}

其中func是方法修饰符

methodname是方法名

param1、param2是方法入参

paramType1、paramType2是方法入参的参数

result1、result2是返回值

resultType1、resultType2是返回值的类型



【备注】:

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类,它的实例是avar 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))}

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

三、题外话

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

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

func (nick intNick) isLessThanParam(param intNick) bool {	return nick < param}

时间: 2024-12-21 18:38:54

【Go语言】【4】GO语言类型和为类型增加方法的相关文章

程序猿之---C语言细节24(段错误、类型提升、sizeof &#39;A&#39;)

主要内容:段错误.类型提升.sizeof  'A' #include <stdio.h> int main() { union test{ char a[10]; int b; }u; int *p = (int *)&(u.a[1]); // 没有引起总线错误 *p = 17; printf("%d\n",*p); #if 0 int *q = 0; // 引起段错误,在linux中运行可看到段错误,在windows下运行时直接出错 *q = 1; #endif

动态语言和静态语言、编译型语言和解释型语言、强类型语言和弱类型语言的分析

一.动态语言和静态语言1. 我们常说的动.静态语言,通常是指: 动态类型语言 Dynamically Typed Language 静态类型语言 Statically Typed Language 可能还有:动.静态编程语言 Dynamic\Statically Programming Language 2.    动态类型语言:在运行期间检查数据的类型的语言例如:Ruby\Python这类语言编程,不会给变量指定类型,而是在附值时得到数据类型.Python是动态语言,变量只是对象的引用,变量a

一起talk C栗子吧(第一百六十八回:C语言实例--C语言中的布尔--bool类型)

各位看官们,大家好,上一回中咱们说的是控制终端字符颜色的例子,这一回咱们说的例子是:C语言中的布尔–bool类型 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,在数字电路中我们经常会遇到布尔类型,其实在编写软件的过程中也会使用布尔类型.布尔类型的变量只有两种值:真和假.在实际的编程过程中,我们经常定义宏,然后使用1表示真,0表示假.下面是具体的例子: #define TRUE 1 #define FALSE 0 例子中定义了两个宏,一个是TRUE,它的值是1,表示真:另外一个是F

[C语言]进阶|结构类型: 枚举, 结构, 类型定义

--------------------------------------------------------------------- 枚举: // main.c #include <stdio.h> const int red = 0; const int yellow = 1; const int green = 2; int main(int argc, const char * argv[]) { /* 常量符号化:用符号而不是具体的数字来表示程序中的数字; 这样看到符号才能知道背

C语言中的系统时间结构体类型

在C语言涉及中经常需要定时触发事件,涉及到获取系统时间,其结构体类型有多种.Unix/Linux系统下有以下几种时间结构: 1.time_t 类型:长整型,一般用来表示从1970-01-01 00:00:00时以来的秒数,精确度:秒:由函数time()获取: 该类型定义在头文件 /usr/include/sys/time.h 中: #define _TIME_T       typedef   long   time_t;             #endif 函数定义:time_t   tim

编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别

一.编译型和解释型 我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码.这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler).如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了.但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织.这时编译各个文件时就会生成目标文件(Object  

强/若类型语言 动/静态语言

弱/强类型指的是语言类型系统的类型检查的严格程度.动/静态指的是变量与类型的绑定方法. 弱类型相对于强类型来说类型检查更不严格,比如说允许变量类型的隐式转换,允许强制类型转换等等.强类型语言一般不允许这么做. 弱类型语言 变量在进行运算时,会做隐式的转换类型强类型语言 变量的值的数据类型一旦确定,使用时不能改变 动态语言:编译时不知道数据类型,只有在执行时才知道数据类型静态语言:编译的时候进行数据类型检查,知道每一个变量的类型 静态类型指的是编译器在compile time执行类型检查,动态类型

弱类型语言和强类型语言

最近开始频繁接触H5,同事说脚本语言大多都是弱类型语言.看了下下弱类型语言和强类型语言的东西. 动态语言和静态语言.1 动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来.Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言.2 静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其

网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型

C语言程序设计进阶_第一周:数据类型:整数类型.浮点类型.枚举类型 1.0数据类型 1.1整数类型 1.2浮点类型 1.3逻辑类型 1.4类型转换和条件运算 1.0数据类型 1 整数 char(%c), short, int(%d), long(%ld), long long(C99) 2 浮点数 float(%f), double(%lf), long double(C99) 3 逻辑 bool(C99) 4 指针 5 自定义类型 所表达的数的范围:char<short<int<flo