整型
- 有符号类型:
int8
、int16
、int32
、int64
- 无符号类型:
uint8
、uint16
、uint32
、uint64
int
、uint
取决于操作系统,在32位系统上int=int32,而在64位系统上int=int64。因此,在实际使用中,推荐使用指定长度的变量类型。
字符类型:byte和rune类型
Go语言的字符有以下两种类型:
- byte类型:是
uint8
的别名,代表一个ASCII码。 - rune类型:是
int32
的别名,代表一个UTF-8字符,由一个或多个byte组成。例如:一个中文字符或者日文字符。
遍历字符串
字符串底层是一个byte数组,所以可以和[]byte类型相互转换,字符串的长度是byte字节的长度。
s := "Hello 你好"
for i := 0; i < len(s); i++ {
fmt.Printf("%v(%c) %d ", s[i], s[i], i)
}
fmt.Println()
for i, v := range s {
fmt.Printf("%v(%c) %d ", v, v, i)
}
// output:
// 72(H) 0 101(e) 1 108(l) 2 108(l) 3 111(o) 4 32( ) 5 228(ä) 6 189(½) 7 160( ) 8 229(å) 9 165(¥) 10 189(½) 11
// 72(H) 0 101(e) 1 108(l) 2 108(l) 3 111(o) 4 32( ) 5 20320(你) 6 22909(好) 9
UTF8编码中,一个中文汉字由3~4个byte组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。
浮点型
Go语言支持的两种浮点型数据:float32
和float64
。
复数
有两种复数类型:complex64
和complex128
。
复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。
布尔型
类型关键字:bool
。取值只有true和false,不允许将整型强制转换为bool型。
默认初始值为false。
字符串
类型关键字:string
。Go 语言里的字符串的内部实现使用UTF-8编码。 多行字符串定义,使用反引号
。如下:
s1 := `第一行
第二行
第三行
`
常用操作
- 求长度 :len(str) 返回字符串所占字节数
- 字符串拼接:+,fmt.Sprintf
// 求长度
s1 := "hello"
s2 := "你好" //一个中文字符占3个字节
s3 := "おはよう"
fmt.Printf("s1 = %s, length = %d \n", s1, len(s1)) // len = 5
fmt.Printf("s2 = %s, length = %d \n", s2, len(s2)) // len = 6
fmt.Printf("s3 = %s, length = %d \n", s3, len(s3)) // len = 12
// 字符串拼接
fmt.Printf("%s \n", s1+" = "+s2)
s := fmt.Sprintf("%s = %s", s1, s3)
fmt.Printf("%s \n", s)
- 字符串分割:strings.Split
// 字符串分割
s := "This is a book"
words := strings.Split(s, " ")
fmt.Printf("%#v", words)
//output: []string{"This", "is", "a", "book"}
- 判断是否包含某子字符串:strings.contains
// 判断是否包含某特定子字符串
s := "This is a book"
b := strings.Contains(s, "is")
println(b)
// output: true
- 判断是否包含某前缀\后缀:strings.HasPrefix,strings.HasSuffix
// 判断是否包含某前缀/后缀
s := "This is a book"
bPre := strings.HasPrefix(s, "This")
bSuf := strings.HasSuffix(s, "TEST")
fmt.Printf("Prefix is existing:%t \n", bPre)
fmt.Printf("Suffix is existing:%t \n", bSuf)
// output: Prefix is existing:true
// Suffix is existing:false
- 子字符串出现的位置:strings.Index(),strings.LastIndex()
// 子字符串出现的index,index从0开始计数
s := "This is a book"
i := strings.Index(s, "i")
l := strings.LastIndex(s, "i")
fmt.Printf(" 第一个i得位置是:%d \n", i)
fmt.Printf(" 最后一个i得位置是:%d \n", l)
// output:
// 第一个i得位置是:2
// 最后一个i得位置是:5
- 以指定字符串连接字符串数组:strings.Join
s := " and "
arr := []string{"aa", "bb", "cc"}
x := strings.Join(arr, s)
fmt.Println(x)
// output: aa and bb and cc
修改字符串
string存储的字符串是不可变的,要修改字符串,需要先将其转换成[]rune
或[]byte
,修改后再转换为string
。修改后的string内容保存在重新分配的内存。
s1 := "big"
// 强制类型转换 string -> []byte
byteS1 := []byte(s1)
byteS1[0] = 'P'
fmt.Println(string(byteS1))
s2 := "hello你好"
// 强制类型转换 string -> []rune
runeS2 := []rune(s2)
runeS2[5] = '您'
fmt.Println(string(runeS2))