第一天,我们已经搭建好了集成开发环境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型。
对整型的详细描述,如表所示。
类型 | 字节数 | 取值范围 | 说明 |
int8 | 1 | -128 ~ 127 | 有符号8位整型 |
uint8 | 1 | 0 ~ 255 | 无符号 8 位整型 |
int16 | 2 | -32768 ~ 32767 | 有符号 16 位整型 |
uint16 | 2 | 0 ~ 65535 | 无符号 16 位整型 |
int32 | 4 | -2147483648 ~ 2147483647 | 有符号 32 位整型 |
uint32 | 4 | 0 ~ 4294967295 | 无符号 32 位整型 |
int64 | 8 | -9223372036854775808 ~ 9223372036854775807 | 有符号 64 位整型 |
uint64 | 8 | 0 ~ 18446744073709551615 | 无符号 64位整型 |
int | 4或8 | 取决与平台 | 有符号32或64位整型 |
uint | 4或8 | 取决与平台 | 无符号32 或64位整型 |
uintptr | 4或8 | 取决与平台 | 用于存放一个指针 |
声明方式如下所示。
var a int8 //声明有符号8位整型
var b uint8 //声明无符号8位整型
Ø 浮点型
浮点型表示存储的数据是实数,如3.145。关于浮点类型的说明,如表所示。
类型 | 字节数 | 说明 |
float32 | 4 | 32位的浮点数类型 |
float64 | 8 | 64位的浮点类型 |
声明方式如下所示。
float32的最大范围是3.4e38,用常量定义是:math.MaxFloat32,在代码中直接使用可以代表最大范围的值。
float64的最大范围是1.8e308,用常量定义是:math.MaxFloat64,在代码中直接使用可以代表最大范围的值。
Ø 复数型
复数型用于表示数学中的复数,如1+2j、1-2j、-1-2j等。关于复数类型的说明,如表所示。
类型 | 字节数 | 说明 |
complex64 | 8 | 64位的复数类型,由float32类型的实部和虚部联合表示 |
complex128 | 16 | 128位的复数类型,由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语言的字符有两种,如表所示。
类型 | 字节数 | 说明 |
Byte | 1 | 表示UTF-8字符串的单个字节的值,uint8的别名类型 |
Rune | 4 | 表示单个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值 | 控制字符 |
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | ” | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | X | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ~ |
31 | US | 63 | ? | 95 | — | 127 | DEL |
注意:在Go语言中,不允许字符串转int,会产生如下错误。
cannot convert str (type string) to type int
Go语言视频教程,持续更新中……