GO语言基本数据类型
1. 介绍
在 Go 编程语言中,数据类型用于声明函数和变量。
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。
go语言基本数据类型分为数字类型、字符串类型、布尔类型
2.数字类型
2.1 整数类型
GO语言中整数类型分为有符号和无符号(类型前面以u
开头),有符号即从**-2(n-1)~2(n-1)-1**,例如int8
的取值范围为-128127,无符号即表示取值为非负数,取值范围从**02^n -1**, 例如uint8
的取值范围为0~255
GO整数类型大小罗列:
类型 | 描述 |
---|---|
uint8 | 无符号 8 位整型 (0 到 255) |
uint16 | 无符号 16 位整型 (0 到 65535) |
uint32 | 无符号 32 位整型 (0 到 4294967295) |
unit64 | 无符号 64 位整型 (0 到 18446744073709551615) |
int8 | 有符号 8 位整型 (-128 到 127) |
int16 | 有符号 16 位整型 (-32768 到 32767) |
int32 | 有符号 32 位整型 (-2147483648 到 2147483647) |
int64 | 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807) |
通常int类型的处理速度也是最快的。因为这是操纵系统根据字节的计算架构自动调整最佳的int类型
2.2 浮点类型
在GO语言中是没有double类型的,GO语言只支持两种浮点型数:float32
和float64
,这两种浮点型数据格式遵循IEEE 754
标准: float32
的浮点数的最大范围约为 3.4e38
,可以使用常量定义:math.MaxFloat32
。 float64
的浮点数的最大范围约为 1.8e308
,可以使用一个常量定义:math.MaxFloat64
。
2.3 复数
复数有实部和虚部,complex64
的实部和虚部为32位,complex128
的实部和虚部为64位。
2.4 其他数字类型
类型 | 描述 |
---|---|
byte | 类似 uint8 |
rune | 类似 int32 |
uint | 32 或 64 位 |
int | 与 uint 一样大小 |
uintptr | 无符号整型,用于存放一个指针 |
3.字符串类型
一个Go语言字符串是一个任意字节的常量序列。[] byte
在Go语言中,字符串字面量使用双引号 ""
或者反引号 '
来创建。双引号用来创建可解析的字符串,支持转义,但不能用来引用多行;反引号用来创建原生的字符串字面量,可能由多行组成,但不支持转义,并且可以包含除了反引号外其他所有字符。双引号创建可解析的字符串应用最广泛,反引号用来创建原生的字符串则多用于书写多行消息,HTML以及正则表达式。
3.1 单行和多行字符串
举例:
package main
import "fmt"
func main() {
// 用""引起来的字符串不支持多行但支持转义,
// 用``支持多行,但不支持转义
var str1 string = "hello world"
var html string = `
<html>
<head>
<title>hello golang</title>
</head>
</html>
`
fmt.Printf("str1: %v\n", str1)
fmt.Printf("html: %v\n", html)
}
运行结果:
str1: hello world
html:
<html>
<head>
<title>hello golang</title>
</head>
</html>
3.2 字符串拼接
方式一:使用 +
或 +=
拼接字符串
虽然Go语言中的字符串是不可变的,但是字符串支持 +
级联操作和+=
追加操作
golang 里面的字符串都是不可变的,每次运算都会产生一个新的字符串,所以会产生很多临时的无用的字符串,不仅没有用,还会给 gc 带来额外的负担,所以性能比较差
举例:
package main
import "fmt"
func main() {
// 使用+或者+=进行字符串拼接,只能是字符串和字符串拼接,不可拼接别的类型
name := "wanik"
age := "20"
msg := name + " " + age
fmt.Printf("msg: %v\n", msg)
fmt.Println("------------------")
msg = ""
msg += name
msg += " "
msg += age
fmt.Printf("msg: %v\n", msg)
}
打印结果:
msg: wanik 20
------------------
msg: wanik 20
方式二:使用fmt.Sprintf()
拼接字符串
内部使用 []byte
实现,不像直接运算符这种会产生很多临时的字符串,但是内部的逻辑比较复杂,有很多额外的判断,还用到了 interface
,所以性能也不是很好
package main
import "fmt"
func main() {
name := "wanik"
age := "20"
msg := fmt.Sprintf("%s %s", name, age)
fmt.Printf("msg: %v\n", msg)
}
打印结果:
msg: wanik 20
方式三:使用strings.Join()
拼接字符串
join会先根据字符串数组的内容,计算出一个拼接之后的长度,然后申请对应大小的内存,一个一个字符串填入,在已有一个数组的情况下,这种效率会很高,但是本来没有,去构造这个数据的代价也不小
package main
import {
"fmt"
"strings"
)
func main() {
name := "tom"
age := "20"
msg := strings.Join([]string{name, age}, ",")
fmt.Printf("msg: %v\n", msg)
}
方式四: **buffer.WriteString()
**方式拼接字符串
这个比较理想,可以当成可变字符使用,对内存的增长也有优化,如果能预估字符串的长度,还可以用 buffer.Grow()
接口来设置 capacity
package main
import (
"bytes"
"fmt"
)
func main() {
var buffer bytes.Buffer
buffer.WriteString("wanik")
buffer.WriteString(",")
buffer.WriteString("20")
fmt.Printf("buffer.String(): %v\n", buffer.String())
}
4. 布尔类型
go语言中的布尔类型有两个常量值:true
和false
。布尔类型经常用在条件判断语句,或者循环语句。也可以用在逻辑表达式中。