序语程言
go语言标准库中对于字符串的操作很完善,以下简单总结一下字符串的操作
一、字符串只能用双引号定义
二、go里单引号和双引号不通过,可以使用`` 号来定义原始输出,不会进行转义,相当于python 里的三引号
package main
import "fmt"
func main() {
name := "杨彦星\n"
s := `杨
adgfgfg
\n\t
`
fmt.Println(name,s)
}
输出
杨彦星
杨
adgfgfg
\n\t
三、字符串是不可改变的
我们说字符串是不可变的指的是字符串内部⽤用指针指向 UTF-8 字节数组,所指向的字节数组不能单独改变。并不是指字符串指向一个新的UTF-8数组
package main
import "fmt"
func main() {
var name string
var name1 = []byte("yangyanxing汉字")
name = string(name1)
fmt.Println(&name,name)
name = "杨彦星" //这个是可以的
fmt.Println(&name) //name 的地址不会改变
//非法
//name[0] = "a"
}
如果想要改变字符串中的值需要先将字符串转为字节数组([]byte)或者字符数组([]rune),有中文的情况下使用字符数组
package main
import "fmt"
func main() {
var name = "yangyanxing"
fmt.Println(&name,name)
names := []byte(name)
//字节数组需要使用单引号,双引号是字符串了
names[0] = 'f'
fmt.Println(&name,string(names))
name = "杨彦星" //这个是可以的
//如果有汉字的话需要使用字符数组
namer := []rune(name)
//需要使用单引号
namer[0] = '饭'
//name 的地址不会改变
fmt.Println(&name,string(namer))
}
四、字符串与字节数组与字符数组的相互转换
package main
import "fmt"
func main() {
var name = "yangyanxing"
fmt.Println(&name,name)
names := []byte(name)
fmt.Printf("%T\n",names)
names[0] = 'f' //字节数组需要使用单引号,双引号是字符串了
name = string(names)
fmt.Println(&name,name)
name = "杨彦星"
//如果有汉字的话需要使用字符数组
namer := []rune(name)
fmt.Printf("%T\n",namer)
namer[0] = '饭'
name = string(namer)
fmt.Println(&name,name) //name 的地址不会改变
}
五、字符串的遍历
字符串可以按字节或者字符来遍历
package main
import "fmt"
func main() {
var name = "yang杨彦星"
//按字节遍历
for i:=0;i
fmt.Printf("%v %T:%v\n",i,name[i],name[i])
}
fmt.Println("")
//按字符遍历
for _,r := range name{
//%c 为输出数值所表示的 Unicode 字符,不带单引号 如 y
//%q 输出数值所表示的 Unicode 字符(带单引号)如 '杨'
fmt.Printf("%c",r)
}
}
结果为
0 uint8:121
1 uint8:97
2 uint8:110
3 uint8:103
4 uint8:230
5 uint8:157
6 uint8:168
7 uint8:229
8 uint8:189
9 uint8:166
10 uint8:230
11 uint8:152
12 uint8:159
yang杨彦星
Process finished with exit code 0
六、字符串的拼接
可以直接使用 + 拼接
package main
import "fmt"
func main() {
//字符串可以使用+进行拼接
var name = "yang" + "yan" + "xing"
fmt.Println(name)
//使用+=在原字符串后面追加字符串
name += "杨彦星"
fmt.Println(name)
// + 不能在行首,只能写在行尾,就和if else中的else那样
s := "BeiJing" +
" TongZhou"
fmt.Println(s)
}
在循环中使用 + 号进行拼接并不是高效的方法,可以使用strings.Join方法
package main
import (
"fmt"
"strings"
)
func main() {
var names = []string{"yang","fan","zhang","li","chen"}
n := strings.Join(names," ")
fmt.Println(n)
s := "yang&aaa&bbb&ccc"
//以&分割
str := strings.Split(s,"&")
fmt.Println(str)
}
结果
yang fan zhang li chen
[yang aaa bbb ccc]
strings包的常用方法
该包提供了字符串操作的常用方法
package main
import (
"fmt"
"strings"
)
func main() {
s := "yang& yan&xing"
//HasPrefix 判断字符串 s 是否以 prefix 开头
fmt.Println(strings.HasPrefix(s,"y"))
//HasSuffix 判断字符串 s 是否以 suffix 结尾
fmt.Println(strings.HasSuffix(s,"aaa"))
//Contains 判断字符串 s 是否包含 substr
fmt.Println(strings.Contains(s,"yang"))
//Replace替换字符串,后一个参数为数量,-1为替换全部
fmt.Println(strings.Replace(s,"y","Y",-1))
//ToLower 将字符串中的 Unicode 字符全部转换为相应的小写字符
ss := "AAA杨彦星BbbbB"
fmt.Println(strings.ToLower(ss))
//ToUpper 将字符串中的 Unicode 字符全部转换为相应的大写字符
fmt.Println(strings.ToUpper(ss))
//strings.TrimSpace(s) 来剔除字符串开头和结尾的空白符号
//中间的不能删除
sp := " aaa bbb ccc "
fmt.Println(strings.TrimSpace(sp))
//还可以去除开头或者结尾指定的字符
ssp := "aaa Hey, how are you George?aaaa"
fmt.Println(strings.TrimLeft(ssp,"He"))
fmt.Println(strings.TrimRight(ssp,"ge"))
fmt.Println(strings.Trim(ssp,"aaa"))
//strings.Fields(s) 将会利用
//strings.Split(s, sep) 用于自定义分割符号来对指定字符串进行分割
sp2 := " aa a b bb ccc "
fmt.Println(strings.Fields(sp2))
fmt.Println(strings.Split(sp2," ")) //使用空格分割
//Join 用于将元素类型为 string 的 slice 使用分割符号来拼接组成一个字符串
sp3 := []string{"aa","a","b","bb","ccc"}
fmt.Println(strings.Join(sp3,"%%%"))
}
结果
true
false
true
Yang& Yan&xing
aaa杨彦星bbbbb
AAA杨彦星BBBBB
aaa bbb ccc
aaa Hey, how are you George?aaaa
aaa Hey, how are you George?aaaa
Hey, how are you George?
[aa a b bb ccc]
[ aa a b bb ccc ]
aa%%%a%%%b%%%bb%%%ccc
字符串与其它类型的转换
使用strconv包中的方法可以实现字符串与其它类型的转换
package main
import (
"fmt"
"strconv"
)
func main() {
//Itoa 将数字转为字符串
fmt.Println(strconv.Itoa(35))
// Atoi 将字符串转为其它类型并不一定会成功
fmt.Println(strconv.Atoi("100"))
fmt.Println(strconv.ParseBool("true")) //可以成功
v,e := strconv.ParseBool("trues")//会有err
if e!=nil{
fmt.Println(e.Error())
}else{
fmt.Println(v)
}
}