基本数据类型
# 整型
- 有符号
- int8
- int16
- int32
- int64
- 无符号
- uint8
- uint16
- uint32
- uint64
- 特殊整型
- uint,32 位操作系统就是 uint32,64 位操作系统就是 uint64
- int,32 位操作系统就是 int32,64 位操作系统就是 int64
- uintptr,无符号整型,用于存放指针
注意:在使用
int
和uint
类型时,不能假定它是 32 位或 64 位的整型,而是考虑int
和uint
可能在不同平台上的差异。
# 进制
// 程序入口
func main() {
// age = "17"
// fmt.Println("Hello World")
// fmt.Print("isOK")
// fmt.Printf("Age: %s", age)\n
var a1 = 10
fmt.Printf("十进制:%d\n", a1)
fmt.Printf("二进制:%b\n", a1)
fmt.Printf("八进制:%o\n", a1)
fmt.Printf("十六进制:%x\n", a1)
// 直接定义八进制
a2 := 077
fmt.Printf("直接声明八进制:%d\n", a2)
// 直接定义十六进制
a3 := 0x12321
fmt.Printf("直接声明十六进制:%d\n", a3)
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 浮点型
Go 语言支持两种浮点型:
- float32,使用常量 math.MaxFloat32 来定义;
- float64,使用常量 math.MaxFloat64 来定义;
打印浮点数,可以用 fmt 包配合%f
,如下:
package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("%f\n", math.Pi)
fmt.Printf("%.2f\n", math.Pi)
}
2
3
4
5
6
7
8
9
# 布尔类型
Go 语言中以bool
类型进行声明布尔型数据,布尔型数据只有true(真)
和false(假)
两个值。
注意:
- 布尔类型变量的默认值为
false
。 - Go 语言中不允许将整型强制转换为布尔型.
- 布尔型无法参与数值运算,也无法与其他类型进行转换。
# 复数
复数有实部和虚部,complex64 的实部和虚部为 32 位,complex128 的实部和虚部为 64 位。如下:
func main(){
var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)
}
2
3
4
5
6
7
8
# 子符串
Go 语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8
编码。 字符串的值为双引号(")
中的内容,可以在 Go 语言的源码中直接添加非 ASCII 码字符,例如:
s1 := "Joker"
s2 := "HelloWorld"
2
如果是多行字符串,则是用反引号,它里面的内容会原样输出,比如:
s1 := `
你好,
欢迎光临。
`
2
3
4
# 字符
组成每个字符串的元素叫做字符
,字符
用''
括起来,如下:
s1 := 'H'
s2 := '你'
2
Go 语言中的字符有两种:
- uint8 类型,或者叫 byte 型,代表
ASCII
码的一个符号; - rune 类型,代表一个
UTF-8
符号;
当需要处理中文、日文或者其他复合字符时,则需要用到rune
类型。rune
类型实际是一个int32
。
Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。
package main
import "fmt"
func main() {
s1 := "Hello World,你好啊!"
// fmt.Printf(s1)
// 遍历字符串,Byte类型
for i := 0; i < len(s1); i++ {
fmt.Printf("%v(%c)", s1[i], s1[i])
}
fmt.Println()
// 遍历字符串,rune类型
for _, r := range s1 {
fmt.Printf("%v(%c)", r, r)
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
其输出结果如下:
72(H)101(e)108(l)108(l)111(o)32( )87(W)111(o)114(r)108(l)100(d)239(ï)188(¼)140()228(ä)189(½)160( )229(å)165(¥)189(½)229(å)149(
)138()239(ï)188(¼)129()
===============================================
72(H)101(e)108(l)108(l)111(o)32( )87(W)111(o)114(r)108(l)100(d)65292(,)20320(你)22909(好)21834(啊)65281(!)
2
3
4
从上可以看到,第一种遍历方法是按字节进行遍历的,而对于非英文字母或者数字来说,其占用的并非一个字节,比如中文在UTF-8
编码中就占用 3 个字节,这时候如果我们按着字节来遍历就会得到第一种结果,这种结果并不是我们想要的。我们就需要采用第二用遍历方式,rune 类型用来 表示UTF-8
字符,一个 rune 字符由一个或者多个字节组成。
# 字符串转义
特殊字符串需要保持其原生的意义,就需要对其进行转义,常用的如下表:
转义符 | 含义 |
---|---|
\r | 回车 |
\n | 换行 |
\t | 制表 |
' | 单引号 |
\ | 反斜杠 |
" | 双引号 |
比如:
package main
import "fmt"
func main() {
s1 := "\"Hello World\""
fmt.Printf(s1)
}
2
3
4
5
6
7
8
# 字符串的常用操作
方法 | 作用 |
---|---|
len(s) | 求长度(是字节的长度) |
+或者 fmt.Sprintf | 字符串拼接 |
strings.Split | 字符串切割 |
strings.contains | 判断字符串中是否包含 |
strings.HasPrefix,strings.HasSuffix | 判断字符串的前缀/后缀(布尔类型) |
strings.Index(),strings.LastIndex() | 输出子串出现的位置(索引) |
strings.Join(a[]string, sep string) | join 操作 |
例子:
package main
import "fmt"
import "strings"
func main() {
s := "Hello World 你好啊!"
// 求长度
fmt.Println(len(s))
// 字符串拼接
s1 := "Joker"
s2 := "你好"
fmt.Println(s1 + s2)
s12 := fmt.Sprintf("%s%s", s1, s2)
fmt.Println(s12)
// 字符串切割
sSplit := strings.Split(s, " ")
fmt.Println(sSplit)
// 判断字符串是否包含
fmt.Println(strings.Contains(s, "H"))
fmt.Println(strings.Contains(s, "L"))
// 判断字符串的前缀
fmt.Println(strings.HasPrefix(s, "H"))
// 判断字符串的后缀
fmt.Println(strings.HasSuffix(s, "啊"))
// 判断字串出现的位置
fmt.Println(strings.Index(s, "H"))
// 判断子串最后出现的位置
fmt.Println(strings.LastIndex(s, "o"))
// join操作
fmt.Println(strings.Join(sSplit, "-"))
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 字符串的修改
要修改字符串,需要先将其转换成[]rune
或[]byte
,完成后再转换为string
。无论哪种转换,都会重新分配内存,并复制字节数组。
package main
import "fmt"
func main() {
s1 := "hello"
// 1、强制转换
byteS1 := []byte(s1)
// 2、进行修改
byteS1[0] = 'H'
// 3、强制转换成字符串并打印
fmt.Println(string(byteS1))
s2 := "我爱你中国"
// 1、强制转换
runeS2 := []rune(s2)
// 2、修改
runeS2[3] = '祖'
// 3、强制转换成字符串并打印
fmt.Println(string(runeS2))
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 类型转换
Go 语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。
强制类型转换的基本语法如下:
T(表达式)
其中,T 表示要转换的类型。表达式包括变量、复杂算子和函数返回值等.