字符串,可以说是大家很熟悉的数据类型之一。定义方法很简单
var name string = "August Rush"
字符串其实就是一个个字符的集合,比如hello
,对照 ascii 编码表,每个字母对应的编号是:104,101,108,108,111
word := "hello"
wordList := []byte{104, 101, 108,108,111}
fmt.Println(string(wordList))
fmt.Println(word)
输出的结果:
hello
hello
从输出结果来看, string 的本质,其实是一个 byte数组
虽然在Go语言中规定字符串只能使用双引号
来表示(不像Python中那样随性)。但这并不是字符串的唯一表示方式。
除了双引号之外 ,你还可以使用反引号。大多情况下,二者并没有区别,但如果你的字符串中有转义字符\
, 这里就要注意了,它们是有区别的。
使用反引号号包裹的字符串,相当于 Python 中的 raw 字符串,会忽略里面的转义。比如我想表示 \r\n
这个 字符串,使用双引号是这样写的,这种叫解释型表示法
var word string = "hello \\r\\n world."
而使用反引号,就方便多了,所见即所得,这种叫原生型表示法
var word string = `hello \r\n world`
通过len()
来测量字符串长度
name := "August Rush"
fmt.Println(len(name))
// 输出的结果为:11
但如果字符串中有中文时,len()
返回长度就是中文占的字节长度
name := "张浩东"
fmt.Println(len(name))
// 输出的结果为:9
想返回字符长度的话
fmt.Println(utf8.RuneCountInString(name))
// 输出的结果为:3
// 是否以xx开头
if strings.HasPrefix(name, "张") {
fmt.Println("姓张。")
}
// 输出的结果为:姓张。
// 是否以xx结尾
if strings.HasSuffix(name, "东") {
fmt.Println("以东结尾。")
}
// 输出的结果为:以东结尾。
word := "呼唤我的名字吧!泽塔奥特曼"
if strings.Contains(word, "泽塔") {
fmt.Println("这个人不会在看泽塔奥特曼吧?!")
}
// 输出的结果为:这个人不会在看泽塔奥特曼吧?!
// 变大写
englishName := "august rush"
fmt.Println(strings.ToUpper(englishName))
// 输出的结果为:AUGUST RUSH
// 变小写
fmt.Println(strings.ToLower(englishName))
// 输出的结果为:august rush
fmt.Println(strings.Trim(englishName, "a")) // 去除两边的'a'
// 输出的结果为:ugust rush
fmt.Println(strings.TrimLeft(englishName, "a")) // 去除左边的'a'
// 输出的结果为:ugust rush
fmt.Println(strings.TrimRight(englishName, "h")) // 去除右边的'h'
// 输出的结果为:august rus
// 替换
fmt.Println(strings.Replace(englishName, "u", "U", 1)) // 替换第一个匹配的‘u’替换成‘U’
// 输出的结果为:aUgust rush
fmt.Println(strings.Replace(englishName, "u", "U", 2)) // 替换两个匹配的‘u’替换成‘U’
// 输出的结果为:aUgUst rush
fmt.Println(strings.Replace(englishName, "u", "U", -1)) // 替换所有匹配的'u'为'U'
// 输出的结果为:aUgUst rUsh
fmt.Println(strings.ReplaceAll(englishName, "u", "U")) // 替换所有匹配的'u'为'U'
// 输出的结果为:aUgUst rUsh
// 分割
fmt.Println(strings.Split(englishName, " ")) // 根据sep切割字符串, 返回一个切片
// 输出的结果为:[august rush]
最简单的就是使用"+"来拼接两个字符串。但效率最低 不推荐使用
firstName := "August"
lastName := "Rush"
fullName := firstName +" " + lastName
fmt.Println(fullName)
// 输出的结果为:August Rush
建议:一种效率一般般的方法
dataList := []string {"August", "Rush"}
fmt.Println(strings.Join(dataList, " "))
// 输出的结果为:August Rush
建议: 一种效率高一点点的方法(before go 1.10)
var buffer bytes.Buffer
buffer.WriteString("我")
buffer.WriteString("爱")
buffer.WriteString("你")
fmt.Println(buffer.String())
// 输出的结果为:我爱你
建议:一种效率更高的方法(after go 1.10)
var moreBuffer strings.Builder
moreBuffer.WriteString("想买")
moreBuffer.WriteString("Switch")
fmt.Println(moreBuffer.String())
// 输出的结果为:想买Switch
string 转 Int
stringNumber := "666"
fmt.Println(strconv.Atoi(stringNumber)) // 内部调用ParseInt
// 输出的结果为:666 <nil>
var result, err = strconv.ParseInt(stringNumber, 10, 32)
fmt.Println(result, err)
// 输出的结果为:666 <nil>
Int 转 string
fmt.Println(strconv.Itoa(666)) // 内部调用FormatInt
// 输出的结果为:666
fmt.Println(strconv.FormatInt(666, 10))
// 输出的结果为:666
字符串转切片
byteSet := []byte(name)
fmt.Println(byteSet)
// 输出的结果为:[229 188 160 230 181 169 228 184 156]
切片转字符串
byteList := []byte{229, 188, 160, 230, 181, 169, 228, 184, 156}
fmt.Println(string(byteList))
// 输出的结果为:张浩东
字符串转rune
runeSet := []rune(name)
fmt.Println(runeSet)
// 输出的结果为:[24352 28009 19996]
rune转字符串
runeList := []rune{24352, 28009, 19996}
fmt.Println(string(runeList))
// 输出的结果为:张浩东
数字转字符
v1 := 24352
fmt.Println(string(v1))
// 输出的结果为:张
字符转数字
num, length := utf8.DecodeRuneInString("张")
fmt.Println(num, length)
// 输出的结果为:24352 3
应用场景:生成一个随机数,然后调用string得到一个随机字符。
索引获取字节
fmt.Println(name[0])
// 输出的结果为:229
切片获取字符区间
fmt.Println(name[0:3])
// 输出的结果为:张
循环
// 第一种方法:获取字节
for i:=0; i<len(name); i++ {
fmt.Println(i, name[i])
}
/*
输出的结果:
0 229
1 188
2 160
3 230
4 181
5 169
6 228
7 184
8 156
*/
// 第二种方法:获取字符
for index, item := range name{
fmt.Println(index, item, string(item))
/*
输出的结果:
0 24352 张
3 28009 浩
6 19996 东
*/
}
基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建