基本类型
速查表
| 类型 | 长度(字节) | 默认值 | 说明 |
|---|---|---|---|
| bool | 1 | false | |
| byte | 1 | 0 | 实际为uint8 |
| rune | 4 | 0 | Unicode Code Point, 实际为int32 |
| int, uint | 4或8 | 0 | 32 或 64 位 |
| int8, uint8 | 1 | 0 | -128 ~ 127, 0 ~ 255 |
| int16, uint16 | 2 | 0 | -32768 ~ 32767, 0 ~ 65535 |
| int32, uint32 | 4 | 0 | -21亿~ 21亿, 0 ~ 42亿 |
| int64, uint64 | 8 | 0 | |
| float32 | 4 | 0.0 | |
| float64 | 8 | 0.0 | |
| complex64 | 8 | ||
| complex128 | 16 | ||
| uintptr | 4或8 | 以存储指针的 uint32 或 uint64 整数 | |
| array | 值类型 | ||
| struct | {} | 值类型 | |
| string | “” | UTF-8 字符串 | |
| slice | nil | 引用类型 | |
| map | nil | 引用类型 | |
| channel | nil | 引用类型 | |
| interface | nil | 接口 | |
| function | nil | 函数 |
::: tip 提示 空为nil,而不是null :::
整型
按长度分为:int8、int16、int32、int64,
对应的无符号整型:uint8、uint16、uint32、uint64
浮点型
float32和float64
复数
复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。
布尔值
bool类型只有:true(真)和false(假)
::: danger 警告
go中bool类型的变量不能作为0参与数值运算,也不会转换类型,也无法将其它类型强制转为bool值
:::
字符串
go中的字符串是utf-8的编码格式(支持中文),字符串的格式为"字符串值"
a := "hello"
b := "你好"
字符串转义符
| 转义 | 含义 |
|---|---|
| \r | 回车符(返回行首) |
| \n | 换行符(直接跳到下一行的同列位置) |
| \t | 制表符 |
| ' | 单引号 |
| \" | 双引号 |
| \\ | 反斜杠 |
| 示例代码如下: |
a:="\r"
b:="\n"
c:="\t"
d:="'" //单引号无需加\
e:="\""
f:="\\"
多行字符串
go可以使用反引号实现多行字符串
a := `第一行
第二行
第三行
`
fmt.println(a)
::: tip 注意 在反引号中所有转义字符都将失效 :::
字符串操作
| 方法 | 介绍 |
|---|---|
| len(str) | 求长度 |
| str[n:m] | 字符截取左闭右开 |
| +或fmt.Sprintf | 拼接字符串 |
| strings.Split | 分割 |
| strings.Contains | 判断是否包含 |
| strings.HasPrefix | 判断前缀 |
| strings.HasSuffix | 判断后缀 |
| strings.Index | 子串开始出现的位置 |
| strings.LastIndex | 子串最后出现的位置 |
| strings.Join(a[]string,sep string) | join操作 |
::: tip 提示
strings提供了很多字符串方法,这里只列举常用的几个,其它方法可以自行尝试
:::
len求字符串的长度:
a := len("hello") // a=5
a := len("h") // a=1
a := len("你") // a=3
a := len("。") // a=3
::: tip 注意 需要注意的是英文字符只占1个字节,而中文占3个字节 :::
字符串截取:
s := "golangcaff"
s[:3] // gol
// 包含中文时可以这样截取
str := "你好world"
a := []rune(str)
string(a[:2]) // 你好
::: tip 注意 如上len求长度一样,中文占3个字节,使用这种方法截取字符串需要注意截取数值 :::
字符串拼接可以使用+或者fmt.Sprintf():
a := "hello"
a = a + " world"
b := fmt.Sprintf("hello %s", "world")
字符串分割成数组strings.Split与字符串数组join字符串strings.Join:
str := "1.2.3.4"
a := strings.Split(str, ".") // [1 2 3 4]
b := strings.Join(a, "-") // 1-2-3-4
字符串是否包含某个子串strings.Contains:
str := "nihao.world"
a := strings.Contains(str, "hao") // a=true
字符串前缀和后缀判断:
str := "nihao.world"
a := strings.HasPrefix(str, "ni") // true
b := strings.HasSuffix(str, "ld") // true
字符串查询子串出现位置:
str := "nihaoya"
a := strings.Index(str, "a") // 3
b := strings.LastIndex(str, "a") // 6
byte和rune
字符类型有两种byte(1个字节,表示ASCII码)和rune(4个字节,代表utf8的一个字符),用单引号'包裹起来类型为rune,如:
a := '你' // rune类型
b := 'h' // rune类型
str := "nihao"
str[0] // byte类型
在遍历含有中文的字符串时,由于str[i]的类型为byte会出现问题,使用range则得到的字符为rune不会出现问题,如:
s := "你好world"
for i := 0; i < len(s); i++ { //byte
fmt.Printf("%v(%c) ", s[i], s[i]) // 228(ä) 189(½) 160( ) 229(å) 165(¥) 189(½) 119(w) 111(o) 114(r) 108(l) 100(d)
}
for _, r := range s { //rune
fmt.Printf("%v(%c) ", r, r) // 20320(你) 22909(好) 119(w) 111(o) 114(r) 108(l) 100(d)
}
类型转换
Go中只有强制类型转换,没有隐式类型转换,整型和浮点型可以通过T(表达式)的方法转换,如:
a := 3
fmt.Println(a / 2) // 1
fmt.Println(float64(a) / 2) // 1.5
b := 3.14
fmt.Println(int(b)) // 3
fmt.Println(int(b) / 2) // 1
字符串与整型和浮点型的转换需要同过strconv方法,如下:
// string到int
int,err := strconv.Atoi(string)
// string到int64
int64, err := strconv.ParseInt(string, 10, 64)
//第二个参数为基数(2~36),
//第三个参数位大小表示期望转换的结果类型,其值可以为0, 8, 16, 32和64,
//分别对应 int, int8, int16, int32和int64
// int到string
string := strconv.Itoa(int)
//等价于
string := strconv.FormatInt(int64(int),10)
// int64到string
string := strconv.FormatInt(int64,10)
//第二个参数为基数,可选2~36
//对于无符号整形,可以使用FormatUint(i uint64, base int)
// float到string
string := strconv.FormatFloat(float32,'E',-1,32)
string := strconv.FormatFloat(float64,'E',-1,64)
// 'b' (-ddddp±ddd,二进制指数)
// 'e' (-d.dddde±dd,十进制指数)
// 'E' (-d.ddddE±dd,十进制指数)
// 'f' (-ddd.dddd,没有指数)
// 'g' ('e':大指数,'f':其它情况)
// 'G' ('E':大指数,'f':其它情况)
// string到float64
float,err := strconv.ParseFloat(string,64)
// string到float32
float,err := strconv.ParseFloat(string,32)