第一天,我们已经搭建好了集成开发环境GoLand以及学习了Go语言的结构组成和编码规范,但想要使用Go语言做出一款高性能的软件,就必须打好Go语言的基础。

那第二天,我们将从变量、数据类型、打印格式化、数据类型转换几个方面讲解Go语言的基础知识。

学习目标

(1)能够掌握变量

(2)能够熟悉数据类型

(3)能够掌握打印格式化

(4)能够掌握数据类型转换


知识讲解

Ø 变量的概念

变量是计算机语言中储存数据的基本单元。变量的功能是存储数据。变量可通过变量名(标识符)访问,例如小千的年龄是18岁,可以使用变量来引用18,如图所示。

变量的本质是计算机分配的一小块内存,专门用于存放指定数据,在程序运行过程中该数值可以发生改变;变量的存储往往具有瞬时性,或者说是临时存储,当程序运行结束,存放该数据的内存就会释放,该变量就会随着内存的释放而消失。就像日常生活中存放水的水杯,当水杯损坏的时候,装在里面的水也会流失掉。

变量又分为局部变量和全局变量。

l 局部变量,是定义在大括号({})内部的变量,花括号的内部也叫作作用域。

l 全局变量,是定义在函数和大括号({})外部的变量。

Go 语言的变量名由字母、数字、下画线组成,首个字符不能为数字;Go语法规定,定义的局部变量若没有被调用会发生编译错误。

编译报错如下:

表达式是值和操作符的组合,它们可以通过求值成为单个值。“数据类型”是一类值,每个值都只属于一种数据类型。

Ø 变量声明

变量声明有多种形式,未初始化的标准格式如下所示。

定义一个变量名为a的int型变量,示例如下。

未初始化的批量格式,不用每行都用var申明,具体语法格式如下所示。

未初始化变量的默认值,有如下特点。

l 整形和浮点型变量默认值:0

l 字符串默认值为空字符串

l 布尔型默认值为false

l 函数、指针变量、切片默认值为nil

初始化变量的标准格式:

初始化变量的编译器自动推断类型格式:

初始化变量的简短声明格式(短变量声明格式):

分别使用以上三种方式定义一个名为a的变量,并初始化为10,示例如下:

使用 := 赋值操作符,:= 可以高效地创建一个新的变量,称之为初始化声明。声明语句省略了var 关键字,变量类型将由编译器自动推断。这是声明变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。该变量名必须是没有定义过的变量,若定义过,将发生编译错误。

编译报错如下:

多个短变量声明和赋值中,至少有一个新声明的变量出现在左侧中,那么即便有其他变量名可能是重复声明的,编译器也不会报错。情况如下所示。

虽然这种方法不会报错,但是在使用过程中应尽量避免。

Ø 变量多重赋值

变量多重赋值是指多个变量同时赋值。Go语法中,变量初始化和变量赋值是两个不同的概念。Go语言的变量赋值与其他语言一样,但是Go提供了其他程序员期待已久的多重赋值功能,可以实现变量交换。多重赋值让Go语言比其他语言减少了代码量。

以简单的算法交换变量为例,传统写法如下所示。

新定义的变量是需要内存的,于是有人设计了新的算法来取代中间变量,其中一种写法如下如下所示。

以Go语言的多重赋值功能为例,写法如下所示。

从以上例子来看,Go语言的写法明显简洁了许多,需要注意的是,多重赋值时,左值和右值按照从左到右的顺序赋值。这种方法在错误处理和函数当中会大量的使用。

Ø 匿名变量

Go语言的函数可以返回多个值,而事实上并不是所有的返回值都用得上。那么就可以使用匿名变量,用“_”下画线替换即可。

例如,定义一个函数,功能为返回两个int型变量,第一个返回10,第二个返回20,第一次调用舍弃第二个返回值,第二次调用舍弃第一个返回值,具体语法格式如下所示。

匿名变量既不占用命名空间,也不会分配内存。

Ø 数据类型

基本数据类型(原生数据类型):整型、浮点型、布尔型、字符串、字符(byte、rune)。

复合数据类型(派生数据类型):指针(pointer)、数组(array)、切片(slice)、映射(map)、函数(function)、结构体(struct)、通道(channel)。

Ø 整型

整型分两大类

有符号整形:int8、int16、int32、int64、int

无符号整型:uint8、uint16、uint32、uint64、uint

其中uint8就是byte型,int16对应C语言的short型,int64对应C语言的long型。

对整型的详细描述,如表所示。


类型字节数取值范围说明
int81-128 ~ 127有符号8位整型
uint810 ~ 255无符号 8 位整型
int162-32768 ~ 32767有符号 16 位整型
uint1620 ~ 65535无符号 16 位整型
int324-2147483648 ~ 2147483647有符号 32 位整型
uint3240 ~ 4294967295无符号 32 位整型
int648-9223372036854775808 ~ 9223372036854775807有符号 64 位整型
uint6480 ~ 18446744073709551615无符号 64位整型
int4或8取决与平台有符号32或64位整型
uint4或8取决与平台无符号32 或64位整型
uintptr4或8取决与平台用于存放一个指针


声明方式如下所示。

var a int8 //声明有符号8位整型

var b uint8 //声明无符号8位整型

Ø 浮点型

浮点型表示存储的数据是实数,如3.145。关于浮点类型的说明,如表所示。


类型字节数说明
float32432位的浮点数类型
float64864位的浮点类型


声明方式如下所示。

float32的最大范围是3.4e38,用常量定义是:math.MaxFloat32,在代码中直接使用可以代表最大范围的值。

float64的最大范围是1.8e308,用常量定义是:math.MaxFloat64,在代码中直接使用可以代表最大范围的值。

Ø 复数型

复数型用于表示数学中的复数,如1+2j、1-2j、-1-2j等。关于复数类型的说明,如表所示。


类型字节数说明
complex64864位的复数类型,由float32类型的实部和虚部联合表示
complex12816128位的复数类型,由float64类型的实部和虚部联合表示


Ø 布尔型

布尔类型用系统标识符bool表示。在其他编程语言中,对于布尔类型的值定义,非0表示真,0表示假。而在Go语言中,布尔值只可以是常量true或者false。

声明方式如下所示。

布尔型无法参与数值运算,也无法与其他类型进行转换。

Ø 字符串

字符串在Go语言中是以基本数据类型出现的,使用字符串就像使用其他原生基本数据类型int、float32、float64、bool一样。

字符串在C++语言中,是以类的方式进行封装,不属于基本数据类型。

有些字符都没有现成的文字代号。所以只能用转义字符来表示 。常用的转义字符如表所示。


转义字符含义
complex64回车符return,返回行首
\r回车符return,返回行首
\n换行符new line,直接跳到下一行的同列位置
\t制表符TAB
\'单引号
\"双引号
\\反斜杠


定义多行字符串的方法如下。

l 双引号书写字符串被称为字符串字面量(string literal),这种字面量不能跨行;

l 多行字符串需要使用反引号“`”,多用于内嵌源码和内嵌数据;

l 在反引号中的所有代码不会被编译器识别,而只是作为字符串的一部分。

Ø 字符

字符串中的每一个元素叫做“字符”,定义字符时使用单引号。Go语言的字符有两种,如表所示。


类型字节数说明
Byte1表示UTF-8字符串的单个字节的值,uint8的别名类型
Rune4表示单个Unicode字符,int32的别名类型


声明示例如下所示。

Ø 通用打印格式

打印格式化通常使用fmt包,通用的打印格式如表所示。


打印格式打印内容
%v值的默认格式表示
%+v类似%v,但输出结构体时会添加字段名
%#v值的Go语法表示
%T值的类型的Go语法表

具体的使用方法,如例所示

Ø 布尔型打印格式

布尔型的具体打印格式如表所示。


打印格式打印内容
%t单词true或false

具体的使用方法,如例所示

Ø 整型打印格式

整型的具体打印格式如表所示。


打印格式打印内容
%b表示为二进制,binary
%c该值对应的unicode码值
%d表示为十进制
%8d表示该整型长度是8,不足8则在数值前补空格。如果超出8,则以实际为准
%08d数字长度是8,不足8位的,在数字前补0。如果超出8,则以实际为准
%o表示为八进制,octal
%q该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
%x表示为十六进制, hex,使用a-f
%X表示为十六进制,使用A-F
%U表示为Unicode格式:U+1234,等价于"U+%04X"


Ø 浮点型与复数型的打印格式

浮点型的具体打印格式如表所示。


打印格式打印内容
%b无小数部分、二进制指数的科学计数法,如-123456p-78
%e(=%.6e)有6位小数部分的科学计数法,如-1234.456e+78
%E科学计数法,如-1234.456E+78
%f(=%.6f)有6位小数部分,如123.456123
%F等价于%f
%g根据实际情况采用%e或%f格式(获得更简洁、准确的输出)
%G根据实际情况采用%E或%F格式(获得更简洁、准确的输出)

具体的使用方法,如例所示

Ø 字符串与字节数组的打印格式

字符串和字节数组的具体打印格式如表所示。


打印格式打印内容
%s直接输出字符串或者[]byte
%q该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
%x每个字节用两字符十六进制数表示(使用a-f)
%X每个字节用两字符十六进制数表示(使用A-F)

具体的使用方法,如例所示。

Ø浮点型和复数型的打印格式

关于复数型的打印演示,如例所示。

Ø字符串与字节数组的打印格式

字符串和字节数组的具体打印格式如表所示。

具体的使用方法,如例所示。

Ø 基本语法

Go语言采用数据类型前置加括号的方式进行类型转换。格式如:T(表达式),T表示要转换的类型;表达式包括变量、数值、函数返回值等。

类型转换时,需要考虑两种类型之间的关系和范围,是否会发生数值截断。就像将1000毫升的水倒入容积为500毫升的瓶子里,余出来500毫升的水便会流失。值得注意的是,布尔型无法与其他类型进行转换。

Ø 浮点型与整型之间转换

float和int的类型精度不同,使用时需要注意float转int时精度的损失。

Ø 整型转字符串类型

这种类型的转换,其实相当于是byte或rune转string。该int数值是ASCII码的编号或Unicode字符集的编号。转成string就是将根据字符集,将对应编号的字符查找出来。当该数值超出Unicode编号范围,则转成的字符串显示为乱码。例如19968转string,就是“一”。

备注:

l ASCII字符集中数字的10进制范围是48~57

l ASCII字符集中大写字母的10进制范围是65~90

l ASCII字符集中小写字母的10进制范围是97~122

l unicode字符集中汉字的范围是4e00-9fa5,十进制范围是19968 - 40869

详情如表所示。

ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32(space)64@96
1SOH3365A97a
2STX3466B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383X115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92/124|
29GS61=93]125}
30RS62>94^126~
31US63?95127DEL

注意:在Go语言中,不允许字符串转int,会产生如下错误。

cannot convert str (type string) to type int


Go语言视频教程,持续更新中……