我们已经搭建好了集成开发环境GoLand以及学习了Go语言的结构组成和编码规范(14天搞定Go语言 —初识Go语言—Go语言的发展历史、Go语言的特性、安装和配置Golang、搭建集成开发环境GoLand、Go语言的结构组成及编码规范),但想要使用Go语言做出一款高性能的软件,就必须打好Go语言的基础。那第二天,我们将从变量、数据类型、打印格式化、数据类型转换几个方面讲解Go语言的基础知识。
变量
Ø 变量的概念
变量是计算机语言中储存数据的基本单元。变量的功能是存储数据。变量可通过变量名(标识符)访问,例如小千的年龄是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、1SOH33!65A97a2STX34”66B98b3ETX35#67C99c4EOT36$68D100d5ENQ37%69E101e6ACK38&70F102f7BEL39,71G103g8BS40(72H104h9HT41)73I105i10LF42*74J106j11VT43+75K107k12FF44,76L108l13CR45-77M109m14SO46.78N110n15SI47/79O111o16DLE48080P112p17DCI49181Q113q18DC250282R114r19DC351383X115s20DC452484T116t21NAK53585U117u22SYN54686V118v23TB55787W119w24CAN56888X120x25EM57989Y121y26SUB58:90Z122z27ESC59;91[123{28FS60<92/124|29GS61=93]125}30RS62>94^126~31US63?95—127DEL注意:在Go语言中,不允许字符串转int,会产生如下错误。
cannot convert str (type string) to type int
Go语言视频教程,持续更新中……
免责声明:本站所有内容及图片均采集来源于网络,并无商业使用,如若侵权请联系删除。