go语言的类型有布尔型(bool)、整型(int8、byte、int16等)、浮点型(float32、float64)、复数类型(complex64、complex128)、字符串、字符型、错误型、指针、数组、切片、字典、通道、结构体、接口。浮点类型采用IEEE-754标准的表达方式;复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部,一个表示虚部。
本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。
Go语言内置以下这些基础类型:
布尔类型:bool。
整型:int8、byte、int16、int、uint、uintptr等。
浮点类型:float32、float64。
复数类型:complex64、complex128。
字符串:string。
字符类型:rune。
错误类型:error。
此外,Go语言也支持以下这些复合类型:
指针(pointer)
数组(array)
切片(slice)
字典(map)
通道(chan)
结构体(struct)
接口(interface)
在这些基础类型之上Go还封装了下面这几种类型:
int、uint和uintptr等。这些类型的特点在于使用方便,但使用者不能对这些类型的长度做任何假设。对于常规的开发来说,用int和uint就可以了,没必要用int8之类明确指定长度的类型,以免导致移植困难。【相关推荐:Go视频教程】
Go 语言中以 bool 类型进行声明布尔类型数据,布尔型数据只有 true
和 false 两个值,需要注意的是:
go 语言中不允许将整型强制转换为布尔型
布尔类型变量默认值为 false
布尔型无法参与数值运算,也无法与其他类型进行转换
Go语言中的布尔类型与其他语言基本一致,关键字也为bool,可赋值为预定义的true和false示例代码如下:
var v1 bool v1 = true v2 := (1 == 2) // v2也会被推导为bool类型
布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。
以下的示例是一些错误的用法,会导致编译错误:
var b bool b = 1 // 编译错误 b = bool(1) // 编译错误 以下的用法才是正确的: var b bool b = (1!=0) // 编译正确 fmt.Println("Result:", b) // 打印结果为Result: true
整型是所有编程语言里最基础的数据类型。Go语言支持表2-1所示的这些整型类型。
1. 类型表示
需要注意的是,int和int32在Go语言里被认为是两种不同的类型,编译器也不会帮你自动做类型转换,比如以下的例子会有编译错误:
var value2 int32 value1 := 64 // value1将会被自动推导为int类型 value2 = value1 // 编译错误
编译错误类似于:
cannot use value1 (type int) as type int32 in assignment
使用强制类型转换可以解决这个编译错误:
value2 = int32(value1) // 编译通过
当然,开发者在做强制类型转换时,需要注意数据长度被截短而发生的数据精度损失(比如将浮点数强制转为整数)和值溢出(值超过转换的目标类型的值范围时)问题。
类型转换
Go 语言中只有强类型转换,没有隐式转换。该语法只能在两个类型
之间支持相互转换的时候使用。强制转换的语法如下:
示例如下:
2. 数值运算
Go语言支持下面的常规整数运算:+、-、*、/和%
加减乘除就不详细解释了,需要说下的是,% 和在C语言中一样是求余运算,比如:
5 % 3 // 结果为:2
3. 比较运算
Go语言支持以下的几种比较运算符:>、1b19c1c8d5c53c490f98195f0d72dedd=、41b5b6c67e32703eb3e30c8ade553aa8,在C#中是Dictionarya8093152e673feb7aba1828c43532094,在Java中是Hashmapa8093152e673feb7aba1828c43532094,在这些语言中,如果要使用map,事先要引用相应的库。而在Go中,使用map不需要引入任何库,并且用起来也更加方便。
map是一堆键值对的未排序集合。比如以身份证号作为唯一键来标识一个人的信息,则这个map可以定义为代码清单 2-3所示的方式。
代码清单2-3 map1.go
package main import "fmt" // PersonInfo是一个包含个人详细信息的类型 type PersonInfo struct { ID string Name string Address string } func main() { var personDB map[string] PersonInfo personDB = make(map[string] PersonInfo) // 往这个map里插入几条数据 personDB["12345"] = PersonInfo{"12345", "Tom", "Room 203,..."} personDB["1"] = PersonInfo{"1", "Jack", "Room 101,..."} // 从这个map查找键为"1234"的信息 person, ok := personDB["1234"] // ok是一个返回的bool型,返回true表示找到了对应的数据 if ok { fmt.Println("Found person", person.Name, "with ID 1234.") } else { fmt.Println("Did not find person with ID 1234.") } }
上面这个简单的例子基本上已经覆盖了map的主要用法,下面对其中的关键点进行细述。
1. 变量声明
map的声明基本上没有多余的元素,比如:
var myMap map[string] PersonInfo
其中,myMap是声明的map变量名,string是键的类型,PersonInfo则是其中所存放的值类型。
2. 创建
我们可以使用Go语言内置的函数make()来创建一个新map。下面的这个例子创建了一个键类型为string、值类型为PersonInfo的map:
myMap = make(map[string] PersonInfo)
也可以选择是否在创建时指定该map的初始存储能力,下面的例子创建了一个初始存储能力为100的map:
myMap = make(map[string] PersonInfo, 100)
创建并初始化map的代码如下:
myMap = map[string] PersonInfo{ "1234": PersonInfo{"1", "Jack", "Room 101,..."}, }
3. 元素赋值
赋值过程非常简单明了,就是将键和值用下面的方式对应起来即可:
myMap["1234"] = PersonInfo{"1", "Jack", "Room 101,..."}
4. 元素删除
Go语言提供了一个内置函数delete(),用于删除容器内的元素。下面我们简单介绍一下如何用delete()函数删除map内的元素:
delete(myMap, "1234")
上面的代码将从myMap中删除键为“1234”的键值对。如果“1234”这个键不存在,那么这个调用将什么都不发生,也不会有什么副作用。但是如果传入的map变量的值是nil,该调用将导致程序抛出异常(panic)
5. 元素查找
在Go语言中,map的查找功能设计得比较精巧。而在其他语言中,我们要判断能否获取到一个值不是件容易的事情。判断能否从map中获取一个值的常规做法是:
(1) 声明并初始化一个变量为空;
(2) 试图从map中获取相应键的值到该变量中;
(3) 判断该变量是否依旧为空,如果为空则表示map中没有包含该变量。
这种用法比较啰唆,而且判断变量是否为空这条语句并不能真正表意(是否成功取到对应的值),从而影响代码的可读性和可维护性。有些库甚至会设计为因为一个键不存在而抛出异常,让开发者用起来胆战心惊,不得不一层层嵌套try-catch语句,这更是不人性化的设计。在Go语言中,要从map中查找一个特定的键,可以通过下面的代码来实现:
value, ok := myMap["1234"] if ok { // 找到了 // 处理找到的value }
判断是否成功找到特定的键,不需要检查取到的值是否为nil,只需查看第二个返回值ok,这让表意清晰很多。配合:=操作符,让你的代码没有多余成分,看起来非常清晰易懂。
更多编程相关知识,请访问:编程教学!!
以上是go语言有哪些类型的详细内容。更多信息请关注PHP中文网其他相关文章!