Go与Python数据结构比对–字符串
python底层是通过c语言实现的,string则是通过字符数组实现。数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 所以说python中string是不可变的。
golang底层也是c语言,string实现也是字符数组,下面主要比较一下基本用法。
创建:
# python可以使用单引号和双引号,使用三引号定义多行字符串
var1 = 'Hello'
var2 = "World!"
var3 = """多行
字符串
"""
// go只能用双引号,使用``反引号定义多行字符串
var str = "hello"
var str = `多行
字符串`
访问字符串中的值:
# python与go都可以通过索引来获取对应位置的字符
字符串 str 的第 1 个字节:str[0]
计算字符串长度:
# python 中使用len(str)计算字符串中字符个数,即字符串长度
len("你好") # 输出 2
// go中len() 按ASCII计算个数
str := "你好"
len(str) // 输出6; Go 语言的字符串都以 UTF-8 格式保存,每个中文占用 3 个字节,因此使用 len() 获得两个 //中文文字对应的 6 个字节。
// 使用 Go 语言中 UTF-8 包提供的 RuneCountInString() 函数,统计 Uncode 字符数量
utf8.RuneCountInString("你好") // 2
字符串遍历
# python
for char in "字符串":
pass
for index in range(len("字符串")):
pass
// go
theme := "狙击 start"
for i := 0; i < len(theme); i++ {
fmt.Printf("ascii: %c %d\n", theme[i], theme[i])
} //得到ASCII字符
for _, s := range theme {
fmt.Printf("Unicode: %c %d\n", s, s)
} //得到uncode字符
字符串拼接:
# python: + 或 join
str = "hello" + "world"
str = "".join(["hello","world"])
// go使用 + 或 bytes.Buffer
hammer := "吃我一锤"
sickle := "死吧"
// 声明字节缓冲
var stringBuilder bytes.Buffer
// 把字符串写入缓冲
stringBuilder.WriteString(hammer)
stringBuilder.WriteString(sickle)
// 将缓冲以字符串形式输出
fmt.Println(stringBuilder.String())
字符串切割:
# python : split()
str = "hello,world"
char_list = str.split(",")
// go : strings.Fields,strings.Split,strings.FieldsFunc切割字符串
1、根据空格键进行分割
方法:strings.Fields(s string) []string
s:要分割的字符串
返回结果为[]string
例: s:=" ab cd ef gh ij kl "
arr:=strings.Fields(s)
fmt.Printf("arr:%q\n",arr)
结果为:arr:["ab" "cd" "ef" "gh" "ij" "kl"]
注: 1.1、分割结果是不包含空字符串的,比如ab前面有一个空格,kl后面也有一个空格,但是分割的结果为 :["ab" "cd" "ef" "gh" "ij" "kl"],而并非: ["" "ab" "cd" "ef" "gh" "ij" "kl" ""]。分割长度为6,而并非是8;
1.2、如果要分割的字符串有多个连续空格出现的话也会,并不会进行多次分割,例如上例中cd和ef之间出现了多个连续空格,结果为: ["ab" "cd" "ef" "gh" "ij" "kl"],而并非:["ab" "cd" "" "" "" "" "ef" "gh" "ij" "kl"]
2、根据某个字符串对另一个字符串进行分割
方法:strings.Split(s,sep string) []string
s:要分割的字符串
sep:要去掉的字符串
返回结果为[]string
例: s:="iiaiibiiciiiidiiii"
sep:="ii"
arr:=strings.Split(s,sep)
fmt.Println("arr:",arr)
结果为:arr:["" "a" "b" "c" "" "d" "" ""]
注:当sep=""时,会根据""进行分割,即结果为:arr:["i" "i" "a" "i" "i" "b" "i" "i" "c" "i" "i" "i" "i" "d" "i" "i" "i" "i"]
3、根据单个字符进行分割
方法:strings.FieldsFunc(s string,f func(rune) bool) []string
s:要分割的字符串
f:自定义的分割规则函数,返回类型为bool类型
返回结果为[]string
例:
f := func(c rune) bool {
if c == '*' || c == '@'||c=='f'||c==' '||c=='二' {
return true
} else {
return false
}
}
s := "@a*b@@c**d## e$f二%ag*"
result := strings.FieldsFunc(s, f)
fmt.Printf("result:%q", result)
结果为:result:["a" "b" "c" "d##" "e$" "%ag"]
注: 1、当连续出现多个符合条件的字符时当次分割只会进行一次,例如s="a**b"或s="a*#b",根据条件c=='*'或c=='*'||c=='#'进行分割时,结果为["a" "b"],而非["a" "" "b"]
2、当要分割的字符出现在s的首或者尾的时候可以忽略,例如s="*a*b*",根据条件c=='*'分割,结果为["a" "b"],而非["" "a" "b" ""]
截取:
python与go都通过切片的形式进行截取
str[startIndex:endIndex]
格式化输出:
# python %与{}两种方式
pi = 3.14159
str = "pi的值是:%s"%pi
str = "pi的值是:{}".format(pi)
// go
pi := 3.14159
// 按数值本身的格式输出
variant := fmt.Sprintf("pi的值是:%v", pi)
常用方法:
# 判断是否为数字
python isnumeric() -- go unicode.IsNumber(v)
python isdigit() -- go unicode.IsDigit(v) # 只包含十进制数字