August Rush

一个还在努力成长的小火汁!

游龙当归海,海不迎我自来也。

We create our own demons.

You can reach me at augustrush0923@gmail.com
Go语言基础-字符串
发布:2021年01月14日 | 作者:augustrush | 阅读量: 334

字符串

字符串,可以说是大家很熟悉的数据类型之一。定义方法很简单

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

判断是否以xxx开头/结尾

// 是否以xx开头
if strings.HasPrefix(name, "张") {
    fmt.Println("姓张。")
}
// 输出的结果为:姓张。

// 是否以xx结尾
if strings.HasSuffix(name, "东") {
    fmt.Println("以东结尾。")
}
// 输出的结果为:以东结尾。


判断是否包含xxx

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构建

版权所有 © 2020-2021 August Rush

京ICP备20007446号-1 & 豫公网安备 41100202000460号

网站地图 & RSS | Feed