第三章:Go 语言数据类型

本贴最后更新于 2985 天前,其中的信息可能已经时移世异

基础数据类型

  • 布尔bool
  • 整型 : int8 , byteint16intuintuintptr
  • 浮点 : float32float64
  • 字符串 : string
  • 字符类型 : rune
  • 复数类型 : complex64complex128
  • 错误类型 :error

3.1 布尔类型

      bool类型在Go语言中可预定义值为true或者false,它不能接受其它类型的赋值,也不能够自动或者强制的类型转换。

3.2 整数类型

      整型是所有编程语言里最基础的数据类型。Go语言支持以下这些整型的数据类型

      Go语言整型

      需要注意的是,int 和 int32 在Go语言里被认为是两种不同的数据类型,编译器不会自动做类型转换,比如下面这个例子会导致编译错误:

      Go语言整型比较

     Go语言支持如下图所示的位运算符:

      Go语言位运算

3.3 浮点类型

      Go语言定义了两种浮点类型,float32等价于java语言的float,float64等价于java语言的double类型。与java语言一样,如果浮点型变量没有明确浮点类型以及不加小数点,编译器会将该变量推导为整型而不是浮点型,如果加入了小数点而没有明确浮点类型,编译器会将该变量推导为float64。因为浮点数不是一种精确的表达方式,所以像整型那样直接用==来判断两个浮点数是否相等是不可行的,这可能导致不稳定的结果。下面是一种推荐的替代方案:

      Go语言浮点数比较

3.4 字符串

      Go语言中字符串的初始化与赋值非常简单,举例如下:

      Go语言字符串赋值

      Go语言支持两种方式遍历字符串,一种诗意字节数组的方式遍历,一种是Unicode字符遍历,如下图所示:

      Go语言字符串遍历

      注意:在Go语言中,每个中文字符在UTF-8中占3个字节,而不是一个字节。以Unicode字符方式遍历时,每个字符的类型是rune,而不是byte。

3.5 字符类型

      在Go语言中支持两个字符类型,一个是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一个是rune,代表单个Unicode。下面的例子展示了整型,字符串之间的相互转化。

      Go语言整型字符串相互转换

3.6 复数类型

      复数实际上有两个实数构成,一个表示实部(real),一个表示虚部(imag)。对于一个复数 Z = complex(x , y) , 就可以通过Go语言内置函数real(z) 获得该复数的实部,也就是x , 通过imag(z) 获得该复数的虚部,也就是y 。 复数表示的示例如下 :

      Go语言复数类型

3.7 错误类型

     Go语言引入了一个关于错误处理的标准模式,即error接口。对于大多数函数,如果要返回错误,大致可以定义为如下模式,将error作为多种返回值中的最后一个,但这并非强制性要求。如下图所示:

      Go语言错误处理 

      下面用Go库中的实际代码来示范如何使用自定义的error类型。

      Go语言错误处理

      

复合数据类型

  • 数组 : array
  • 切片 : slice
  • 字典 : map
  •  指针: pointer
  • 通道 : chan
  • 接口 : interface
  • 结构体 : struct

3.8 数组

      数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element) , 一个数组包含的元素个数被称为数组的长度。在Go语言中,数组长度在定义以后就不可以更改,在声明长度时可以为一个常量或者一个常量表达式(常量表达式是指在编译期间即可计算结果的表达式)。数组的长度是该数组类型的一个内置常量,可以用Go语言的内置函数len()来获取。

       Go语言数组

      Go语言中,对数组的访问,可以直接使用数组下标的访问数组中的元素。数组下标与Java语言相似,都是从0开始。len(array) - 1 则表示最后一个数组下标。

       Go语言数组遍历

      需要特别注意的是,在Go语言中数组是一个值类型。所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作。如果将数组作为函数的参数类型,则在函数调用时该参数将发生复制。因此,在函数体中无法修改传入数组的内容,因为函数内操作的只是所传数组的一个副本。下面的额例子来说明这一特点:

      Go语言数组复制

3.9 切片

      数组的长度,在定义以后无法修改;数组是值类型,每次传递都将产生一个副本,这种数据结构无法满足开发者的真实需求,在这样的背景下,数组切片应运而生了,它弥补了当前数组的不足。初看起来,数组切片(slice)就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针。数组切片的数据结构可以抽象为以下3个变量:

  • 一个指向原生数组的指针
  • 数组切片中的元素个数
  • 数组切片已分配的存储空间

      基于数组,数组切片添加了一系列管理功能,可以随时动态扩充存放空间,并且可以随时传递而不会导致所管理的元素被重复复制。 创建数组切片的方法主要有两种:基于数组和直接创建。数组切片可以基于一个已存在的数组创建,甚至可以创建一个比所基于的数组还要大的数组切片。

      Go语言基于数组切片

      并非一定要事先准备好一个数组才能够创建数组切片。Go语言提供的内置函数mark()可以用于灵活的创建数组切片。如下图所示:

      Go语言直接创建数组切片

      与数组相比,数组切片多了一个存储能力(Capacity)的概念,即元素个数和分配的空间可以是两个不同的值。合理的设置存储能力的值,可以大幅降低数组切片内部分配内存和搬送内存块的频率,从而大大提高程序性能。假如已知某元素的存储个数为50,如果设置的存储能力小于50,比如20,那么,在元素超出20时,底层将会至少发生一次这样的动作:重新分配一块“够大”的内存,并且需要把原来的内存块复制到新的内存块中,这会产生很多明显的开销。如果,重新分配的空间还是不够大,那么程序又会重复执行一次。如果,我们在一开始就设置存储能力为50,那么,以后就不会发生这样非常消耗CPU的动作,从而达到空间换时间的效果。

      Go语言数组切片追加以及复制

3.10 map

      map是一堆键值对未排序的集合。在Go语言中,使用map不需要引入任何库,而且使用起来也更加方便。

      Go语言map

 

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1388 回帖 • 278 关注
  • 数据类型
    3 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...