go字符串相关操作

1. len 按字节计算字符串长度

len是按照字节的长度计算字符串长度,不是按照字符数量来的,比如下面这个例子:

// main.go

package main

import "fmt"

func main() {
    var (
        s1 = "你好中国"
        s2 = "hello china"
    )

    fmt.Println("s1的长度:", len(s1))   
    fmt.Println("s2的长度:", len(s2))   
}


// 输出:
// s1的长度: 12
// s2的长度: 11

可以从这段代码看出,一个中文字符是3个字节,一个英文字符是1个字节,仅仅只有4个汉字使用len计算的长度都要比10个英文字母和一个空格加起来使用len计算的长度还要长。

2. 字符串遍历问题

在go中我们非常清楚遍历一个字符串可以使用 for ... range ... 的语法进行遍历,所以遍历一段中文字符串的代码可以如下:

// main.go
package main

import "fmt"

func main() {
    var (
        s1 = "你好中国"
        s2 = "hello china"
    )
    fmt.Println("你好中国遍历:")
    for i, v := range s1{
        fmt.Printf("  i:%v v:%v  ", i, v)
    }

    fmt.Println("\n\nhello china遍历:")
    for i, v := range s2{
        fmt.Printf("  i:%v v:%v  ", i, v)
    }
}


// 输出:
你好中国遍历:
  i:0 v:20320    i:3 v:22909    i:6 v:20013    i:9 v:22269 

hello china遍历:
  i:0 v:104    i:1 v:101    i:2 v:108    i:3 v:108    i:4 v:111    
  i:5 v:32    i:6 v:99    i:7 v:104    i:8 v:105    i:9 v:110    i:10 v:97 

从这段代码的输出可以看出,go中使用 for ... range ... 方式遍历中文字符串时,索引的跳动是3个字节进行跳动的,非我们想要的。

这个时候我们就需要使用 []rune(str) 对字符串进行转换,代码如下:

package main

import "fmt"

func main() {
    var (
        s1 = "你好中国"
        s2 = "hello china"
    )

    r1 := []rune(s1)
    r2 := []rune(s2)

    fmt.Println(r1)
    fmt.Println(r2)

    fmt.Println("你好中国遍历:")
    for i, v := range r1{
        fmt.Printf("  i:%v v:%v  ", i, v)
    }

    fmt.Println("\n\nhello china遍历:")
    for i, v := range r2{
        fmt.Printf("  i:%v v:%v  ", i, v)
    }
}

// 输出:
你好中国遍历:
  i:0 v:20320    i:1 v:22909    i:2 v:20013    i:3 v:22269 

hello china遍历:
  i:0 v:104    i:1 v:101    i:2 v:108    i:3 v:108    i:4 v:111    
  i:5 v:32    i:6 v:99    i:7 v:104    i:8 v:105    i:9 v:110    i:10 v:97 

可以看出,此时的中文的索引位置都已经正确了,这样在中英文混合的字符串中,就不必考虑索引跳位的问题了。

3. 字符串转整数

str := strconv.Atoi("123")

4. 整数转字符串

n, err := strconv.Itoa(123)

5. 字符串转[]byte

var bytes = []byte(str)

6. []byte转字符串

var s = string([]byte{97,98,99})

7. 十进制转2、8、16进制
str = strconv.FormatInt(100, 2)
str = strconv.FormatInt(100, 8)
str = strconv.FormatInt(100, 16)
8. 包含子串
strings.Contains("hello world", "hello")  // true
9. 统计子串的数量
strings.Count("hello world", "o")   // 2
10. 不区分大小写比较字符串
strings.EqualFold("Abc", "abc")
11. 返回子串第一次出现的索引,找不到返回-1
strings.Index("abcde", "cde")   // 2
12. 返回子串最后一次出现的索引,找不到返回-1
strings.Index("abcdabcde", "cd")  // 6
13. 将指定子串替换成其他字符串
strings.Replace("go go go come go!", "go", "ok", 3)   
// 3 代表替换三次, 如果是-1则代表全部更换
14. 按照某字符切割字符串
strings.Split("hello world,china", ",")   
// []string{"helllo world", "china"}
15. 将字符串大小写进行转换
strings.ToLower("Go")   // go
strings.ToUpper("Go")   // GO
16. 将字符串左右两侧空格去掉
strings.TrimSpace("  abc  ")   // abc
17. 将字符串左右两侧指定字符去掉
strings.Trim("abc", "ac")   // b
18. 将字符串左侧指定字符去掉
strings.TrimLeft("abc", "ac")  // bc
19. 将字符串右侧指定字符去掉
strings.TrimRight("abc", "ac")   // ab
20. 判断字符串是否以某个子串开头
strings.HasPrefix("abcdddd", "abc")  // true
21. 判断字符串是否以某个子串结尾
strings.HasSuffix("adfasdfasf", "xy")  // false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值