默认是utf-8编码,字符串可以为空,但不能为0,并且是常量,不能修改(这点与c++中的string不同)
底层是一个结构体,该结构体有两个成员,一个是指向字节数组起点的指针,另一个是长度
package main
import (
"fmt"
"strings"
)
func main() {
path := "\\Users\\wzh\\go\\src\\goStudt"
/*
fmt.Println(path)
//多行字符串, ``中的内容格式直接输出并且格式一致
s2 := `
苟利国家生死以
岂因福祸避趋之
`
fmt.Printf("%v", s2)
*/
//字符串相关操作
fmt.Println(len(path))
name := "messi"
world := "xavi"
fmt.Printf("字符串拼接方式1:%v\n", name+world)
ss2 := fmt.Sprintf("%s,%s", name, world)
fmt.Println(ss2)
//分割
split_res := strings.Split(path, "\\")
fmt.Println(split_res) // [ Users wzh go src goStudt]
split_res_2 := strings.Split(path, ",")
fmt.Println(split_res_2) // [\Users\wzh\go\src\goStudt]
//包含
fmt.Println(strings.Contains(path, "666"))
fmt.Println(strings.Contains(path, "src"))
//是否以某前缀开头
fmt.Println(strings.HasPrefix(path, "Users"))
//后缀
fmt.Println(strings.HasSuffix(path, "\\goStudt"))
}
rune类型
Go语言的字符有以下两种:
1.byte类型,代表了ASCII码的一个字符,是uint8的别名
2.rune类型,代表一个UTF-8字符,当处理中文,日文,或其他复合字符时,则需要用到rune类型,该类型下,一个汉字一般由3-4个字节组成,rune类型实际是一个int32类型
下面的代码段中,第二种方式输出正确,第一种方式由于都按照byte类型输出,所以在汉字部分会乱码
range迭代string时,迭代的是Unicode不是字节,第一个返回值是UTF-8编码第一个字节的索引,所以索引值可能并不是连续的。
第二个返回值的类型为rune,不是string类型的,如果要使用该值需要格式化
package main
import "fmt"
func main() {
s := "hello梅西"
for i := 0; i < len(s); i++ {
fmt.Printf("%d:%v(%c)", i, s[i], s[i])
}
fmt.Println()
for i, r := range s {
fmt.Printf("%d:%v(%c)", i, r, r)
}
}
package main
import "fmt"
func main() {
s := "hello梅西"
fmt.Printf("%T", s[0])
fmt.Printf("%T", s[5])
for i, r := range s {
fmt.Printf("%d %T :%v(%c)\n", i, r, r, r)
}
/*
uint8 uint8
0 int32 :104(h)
1 int32 :101(e)
2 int32 :108(l)
3 int32 :108(l)
4 int32 :111(o)
5 int32 :26757(梅)
8 int32 :35199(西)
*/
}
修改字符串
Go中的字符串无法直接修改,需要先将其转换成[]rune或[]byte,完成后再转换为string,转换时会重新分配内存,并复制字节数组
package main
import (
"fmt"
)
func main() {
s := "hello梅西"
rune_array := []rune(s)
rune_array[6] = '罗'
rune_array[0] = 'C'
s_2 := string(rune_array)
fmt.Println(s_2)
byte_array := []byte(s)
byte_array[6] = '罗' //报错,类型不一致
byte_array[0] = 'C'
s_3 := string(byte_array)
fmt.Println(s_3)
}
类型转换
Go中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。
package main
import "fmt"
func main() {
var a int64 = 1
b := float64(a)
fmt.Printf("%f", b)
}