Go语言字符串

1. Go 语言字符串底层实际上是 byte 数组,所以字符串中的每一个字符为 byte 类型,byte 其实是 uint8 的一个别名,字符串中的每一个字符可以看成是 0~225 之间的某一个整数,Go 语言字符串本身不支持直接修改,需要使用 byte() 函数将其转为 byte 数组:s1 := []byte(s) 才可以进行修改,修改完成之后可以使用 string() 函数将其转为字符串即可;字符串遍历有两种方式:第一种使用 for循环的下标遍历,也即普通的 for 循环遍历;第二种使用 for-range 来遍历,需要注意的是 for-range 遍历字符串的时候会得到每一个字符对应的下标以及对应字符的 int32 类型的整数表示,这其实与 go 语言 range 函数的内部机制有关,遍历字符串的时候会将原来字符串中 uint8 类型的字符转为 int32,所以这也是下标遍历与 for-range 遍历字符串的一个区别,并且字符加上一个整数的操作过程中会向下兼容,比如 c = 'a' 本质上是 int32 类型的数字(直接声明一个字符与字符串中的字符又有点区别,两者类型是不一样的),加上 byte(x),其中 x 为 int 类型的数字,结果为 byte 类型的数字,也即 res := 'a' + byte(x),res 的类型为 byte: 

package main

import "fmt"


func main() {
	s := "abc"
    // 将s转为byte数组才可以进行修改
	s1 := []byte(s)
	c := s[0] - 'a'
	// %T输出对应的类型, %v输出变量对应的值
	fmt.Printf("%T %T %T %T %v %v\n", c, s[0], 'a', 'a'+byte(8), s[0], s1)
    // 遍历字符串有两种方式: 1. 索引遍历 2. for-range遍历
	// _表示忽略遍历s的时候得到的下标, v表示当前索引对应字符的int32整数表示
	for _, v := range s {
		fmt.Printf("%T %T %T %T\n", v-'a', v, 'a', 'a'+byte(8))
	}
    // 索引遍历
    for i := 0; i < len(s); i++ {
		fmt.Printf("%T \n", s[i])
	}
}

  

2. 将字符串转为一个整数,有的时候需要将字符串转为 int 类型的数字,除了调用 strconv 包中的相关函数之外,其实我们还可以使用字符串底层为 uint8 类型整数的这个特点通过 int,int64 或者其他函数将其转为整数,通过遍历整数类型的字符串可以发现得到的是对应字符的 ascii 值,将  ascii 值与 15 进行与运算就可以得到当前位对应的整数值,最终就可以得到字符串 s 对应的整数值:

package main

import "fmt"

func main() {
	// 在声明字符串s的时候使用":="快速初始化s
	s := "0123456789"
	// 使用索引遍历字符串
	for i := 0; i < len(s); i++ {
		// 使用Printf格式化输出
		fmt.Printf("%v ", s[i])
	}
	fmt.Println()
	s1 := "392932"
	n := 0
    // 将s1转位int类型整数
	for i := 0; i < len(s1); i++ {
		n = n*10 + int(s1[i]&15)
	}
	fmt.Printf("%v", n)
}

3. 字符串的常用操作,主要是分隔字符串,判断是否存在某个子串,是否存在某个前缀或者某个后缀,找到某个子串第一次出现的位置,拼接字符串等操作,可以使用 Sprintf 来拼接字符串等,主要是调用 strings 包下的函数:

package main

import (
	"fmt"
	"strings"
)

func main() {
	// 1. len(str)获取字符串的长度
	s := "Hello World!"
	fmt.Println(len(s))

	// 2. strings.Split()按照分隔符切分字符串, 函数的返回值是按照分隔符切分之后的字符串切片
	s1 := "I am a student"
	s2 := strings.Split(s1, " ")
	for i := 0; i < len(s2); i++ {
		fmt.Print(s2[i], " ")
	}
	fmt.Println()

	// 3. Contains()判断字符串中是否包含子串substr
	fmt.Println(strings.Contains(s1, "am"))

	// 4. HasPrefix(),HasSuffix()判断是否包含前缀与后缀
	fmt.Println(strings.HasPrefix("abbbcas", "abb"))
	fmt.Println(strings.HasSuffix("abbbcas", "cas"))

	// 5. strings.Index()返回子串第一次出现的位置, 不存在返回-1
	// strings.LastIndex()返回子串最后一次出现的位置, 不存在返回-1
	s3 := "abbabbabbab"
	fmt.Println(strings.Index(s3, "abb"))
	fmt.Println(strings.LastIndex(s3, "abb"))

	// 6. join()对string切片的元素添加分隔符的操作, 返回的是添加分隔符之后的字符串
	s4 := []string{"I", "am", "a", "student"}
	fmt.Println(s4)
	fmt.Println(strings.Join(s4, " "))
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值