Go语言学习(4) - 基本数据类型

Go语言中的数据类型包含两种:

  • 基本数据类型(原生数据类型):整型、浮点型、布尔型、字符串、字符(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型

序号 类型和描述
1 uint8:无符号8位整型(0到255)【2的8次方】
2 uint16:无符号16位整型(0到65535)【2的16次方】
3 uint32:无符号32位整型(0到4292967295)【2的32次方】
4 uint64:无符号位64位整型(0到 18446744073709551615)【2的64次方】
5 int8:有符号8位整型(-128到127)
6 int16:有符号16位整型(-32768到32767)
7 uint32:有符号32位整型(-2147483648到2147483647)
8 uint64:有符号位64位整型(-9223372036854775808到 9223372036854775807)

还有其他数字类型

序号 类型和描述
1 byte 类似 uint8
2 rune 类似int32
3 uint 32或者64位,根据电脑机器的位数决定
4 int 与uint一样大小
5 uintptr 无符号整型,用于存放一个指针

当超过数据类型所要求的长度时,就会报错:constant xxx overflows byte。

字符

下面看一下 byte 和 rune 到底是不是 我们上面描述的,分别 对应 uint8 和 int32,代码如下,我们还是打印出变量的类型 和 值:

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import "fmt"

func main() {

a := 100
var b byte = 100
var c rune = 200

fmt.Printf("%T %v \n", a , a)
fmt.Printf("%T %v \n", b , b)
fmt.Printf("%T %v \n", c , c)
}

输出结果如下:

1
2
3
int 100 
uint8 100
int32 200

事实证明,我们上面描述的是没有问题的。实际上,我们通常不会将 byte 和 rune 直接赋值为 数字类型,我们通常 赋值为 字符,类似于 Java 中的 char,如下:

1
2
3
4
var e byte = 'a'
var f rune = 'A'
fmt.Printf("%T %v \n", e , e)
fmt.Printf("%T %v \n", f , f)

输出结果如下:

1
2
uint8 97 
int32 65

那么,byte 和 rune 有什么区别呢?我们先来看一个例子,假设 将 上面的 f 值 赋值为 汉字 大写的 一,那么 是怎么样的结果呢,然后将 e 的 值也赋值为 “一”,结果是什么呢?

我们会发现,将 f 赋值为 “一”,输出 为:int32 19968;将 e 赋值为 “一”,会报一个异常:constant 19968 overflows byte,这是因为 byte 即 uint8 的最大值 是 255,而 “一” 对应的值 为 19968,远远大于 uint8 的最大值。

byte 和 rune 的区别如下:

  • byte型:其实就是 uint8 的别名,代表了一个ASCLL 码的一个字符
  • rune型:其实就是 int32 ,代表了一个UTF-8字符,当需要处理中文等 unicode 字符集时就要用到 rune 类型

字符串

字符串在Go语言中是以基本数据类型出现的。

在Go语言中,字符串 即可以单行定义,又可以多行定义,单行定义 不需要阐述,下面我们介绍下定义多行字符串

  • 双引号书写字符串被称为字符串字面量,这种字面量不能跨行;
  • 多行字符串需要使用 “·” 反引号(位于Tab键上面的一个),多用于内嵌源码 和 内嵌数据;
  • 在反引号中的所有代码不会被编译器识别,而只是作为字符串的一部分

当我们想 将 一段代码作为 字符串输出的时候,我们 发现 要输出 就只能 调为一行,但Go语言给我们提供了 多行字符串,如下:

1
2
3
4
5
6
7
8
9
10
temp := `
a := 100
var b byte = 256
var c rune = 200

fmt.Printf("%T %v \n", a , a)
fmt.Printf("%T %v \n", b , b)
fmt.Printf("%T %v \n", c , c)
`
fmt.Println(temp)

输出结果如下:

1
2
3
4
5
6
7
a := 100
var b byte = 256
var c rune = 200

fmt.Printf("%T %v \n", a , a)
fmt.Printf("%T %v \n", b , b)
fmt.Printf("%T %v \n", c , c)

这样就可以讲 我们拷贝的一段代码 原样输出。

以上主要讲解了 基本数据类型,后续 会继续讲解 派生数据类型。

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------
分享到:
0%