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

    技术2023-12-05  96

    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) # 只包含十进制数字
    Processed: 0.011, SQL: 9