目录
数据类型
在go中我们经常看到这样的变量声明:
var (
a int
b string
c float32
)
在Go中所有变量都是有类型的, 比如前面的int, string, float32 这些, 因此在接下来我们将先讲解下Go的基础类型
go在语言成面定义了如下几种基础类型:
-
整形 12345
-
浮点型 123.45
-
复数 123.45i
-
字符 'a'
-
字符串 "abc"
-
布尔类型 true, false
-
枚举类型 iota
-
自定义类型
整形
类型名 | 字节宽度 | 取值范围 |
---|---|---|
int | 与平台有关 | 32 位系统 4 字节,64 位系统 8 字节 有符号整型 |
uint | 与平台有关 | 32 位 系统 4 字节,64 位 系统 8 字节 无符号整形 |
int8 | 1 字节 | 用 8 位表示的有符号整型 取值范围为:[-128, 127] |
int16 | 2 字节 | 用 16 位表示的有符号整型 取值范围为:[-32768,32767] |
int32 | 4 字节 | 用 32 位表示的有符号整型,取值范围为:[-2147483648,2147483647] |
int64 | 8 字节 | 用 64 位表示的有符号整型,取值范围为:[-9223372036854775808,9223372036854775807] |
uint8 | 1 字节 | 用 8 位表示的无符号整型,取值范围为:[0,255] |
uint16 | 2 字节 | 用 16 位表示的无符号整型,取值范围为:[0,65535] |
uint32 | 4 字节 | 用 32 位表示的无符号整型,取值范围为:[0,4294967295] |
uint64 | 8 字节 | 用 64 位表示的无符号整型,取值范围为:[0,18446744073709551615] |
uintptr | 与平台有关 | 32 位系统 4 字节,64 位系统 8 字节指针值的无符号整型 |
特殊整型
类型 | 描述 |
---|---|
uint | 32位操作系统上就是uint32 ,64位操作系统上就是uint64 |
int | 32位操作系统上就是int32 ,64位操作系统上就是int64 |
uintptr | 无符号整型,用于存放一个指针 |
注意: 在使用int
和 uint
类型时,不能假定它是32位或64位的整型,而是考虑int
和uint
可能在不同平台上的差异。
注意事项 获取对象的长度的内建len()
函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int
来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int
和 uint
。
浮点型
类型名 | 字节宽度 | 取值范围 |
---|---|---|
float32 | 4字节 | IEEE-754 32位浮点型数 |
float64 | 8字节 | IEEE-754 64位浮点型数 |
complex64 | 4字节 | 32 位实数和虚数 |
complex128 | 8字节 | 64 位实数和虚数 |
别名
类型名 | 字节宽度 | 取值范围 |
---|---|---|
byte | 1 字节 | 字节类型,取值范围同 uint8 |
rune | 4 字节 | Unicode 码点 取值范围同 uint32 |
字符串类型
Go 语言内置了字符串类型,使用 string 表示
字面量:
-
可解析字符串:通过双引号(")来创建,不能包含多行,支持特殊字符转义序列
-
原生字符串:通过反引号(`)来创建,可包含多行,不支持特殊字符转义序列
特殊字符:
-
\:反斜线
-
':单引号
-
":双引号
-
\a:响铃
-
\b:退格
-
\f:换页
-
\n:换行
-
\r:回车
-
\t:制表符
-
\v:垂直制表符
-
\ooo:3 个 8 位数字给定的八进制码点的 Unicode 字符(不能超过\377
-
\uhhhh:4 个 16 位数字给定的十六进制码点的 Unicode 字符
-
\Uhhhhhhhh:8 个 32 位数字给定的十六进制码点的 Unicode 字符
-
\xhh:2 个 8 位数字给定的十六进制码点的 Unicode 字符
字符串的常用操作
方法 | 介绍 |
---|---|
len(str) | 求长度 |
+或fmt.Sprintf | 拼接字符串 |
strings.Split | 分割 |
strings.contains | 判断是否包含 |
strings.HasPrefix,strings.HasSuffix | 前缀/后缀判断 |
strings.Index(),strings.LastIndex() | 子串出现的位置 |
strings.Join(a[]string, sep string) | join操作 |
修改字符串
要修改字符串,需要先将其转换成[]rune
或[]byte
,完成后再转换为string
。无论哪种转换,都会重新分配内存,并复制字节数组。
func changeString() {
s1 := "big"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'p'
fmt.Println(string(byteS1))
s2 := "白萝卜"
runeS2 := []rune(s2)
runeS2[0] = '红'
fmt.Println(string(runeS2))
}
布尔类型
布尔类型用于表示真假,类型名为 bool,只有两个值 true 和 false,占用一个字节宽度,零值为 false
var (
IsBoy bool = true
IsGirl bool = true
)
枚举类型
常使用 iota 生成器用于初始化一系列相同规则的常量,批量声明常量的第一个常量使用 iota 进行赋值,此时 iota 被重置为 0,其他常量省略类型和赋值,在每初始化一个常量则加 1
import (
"fmt"
)
const (
a = iota
b
c
d
)
func main() {
var
fmt.Println(a, b, c, d)
}
自定义类型
在 go 语言中使用 type 声明一种新的类型,语法格式为: type TypeName Formatter
比如我们可以定义自己
type Gender string
类型转换
Go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。
强制类型转换的基本语法如下:
T(表达式)
其中,T表示要转换的类型。表达式包括变量、复杂算子和函数返回值等.
比如计算直角三角形的斜边长时使用math包的Sqrt()函数,该函数接收的是float64类型的参数,而变量a和b都是int类型的,这个时候就需要将a和b强制类型转换为float64类型。
func sqrtDemo() {
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是float64类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
}