Go与Python数据结构比对--字符串

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)  # 只包含十进制数字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值