首页 >后端开发 >Golang >go语言有哪些类型

go语言有哪些类型

青灯夜游
青灯夜游原创
2022-12-02 19:18:146988浏览

go语言的类型有布尔型(bool)、整型(int8、byte、int16等)、浮点型(float32、float64)、复数类型(complex64、complex128)、字符串、字符型、错误型、指针、数组、切片、字典、通道、结构体、接口。浮点类型采用IEEE-754标准的表达方式;复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部,一个表示虚部。

go语言有哪些类型

本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

Go语言的类型

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

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

1.png

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所示的这些整型类型。

2.png

3.png

4.png

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 语言中只有强类型转换,没有隐式转换。该语法只能在两个类型
之间支持相互转换的时候使用。强制转换的语法如下:

5.png

示例如下:

6.png

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn