GO语言:string

GO语言:string

len()

	// 求长度 len() 所得为字符串所占的字节数
	length := len("Hello world")
	fmt.Println(length)
	// len == 12 go语言字符串使用utf-8编码 一个汉字占3个字节
	length = len("我是魚禾")
	fmt.Println(length)

结果:

11
12

len()获取的是字符串所占字节数的大小,而不是字符串字符的数量
若要计算字符串字符数量,因先将字符串转换为[]rune切片

	// 求长度 len() 所得为字符串所占的字节数
	length := len([]rune("Hello world"))
	fmt.Println(length)
	// len == 12 go语言字符串使用utf-8编码 一个汉字占3个字节
	length = len([]rune("我是魚禾"))
	fmt.Println(length)

结果:

11
4

在Go 语言中,字符的类型有以下两种:

  • uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
  • rune类型,代表一个 UTF-8字符。
    当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。
    rune类型实际是一个int32。
	char := '魚'
	fmt.Printf("%T", char)

结果:

int32

当需要处理中文等ASCII无法表示的字符时,需要使用rune类型来处理。
当然也可以使用byte进行处理

	s1 := "Hello world"
	for i := 0; i < len(s1); i++ {
		fmt.Printf("%c(%d) ", s1[i], s1[i])
	}
	fmt.Println()
	s2 := "你好"
	for _, char := range s2 {
		fmt.Printf("%c(%d) ", char, char)
	}
	fmt.Println()
	s3 := "Hello 嗨"
	for i := 0; i < len(s3); i++ {
		fmt.Printf("%c(%d) ", s3[i], s3[i])
	}
	fmt.Println()

结果:

H(72) e(101) l(108) l(108) o(111)  (32) w(119) o(111) r(114) l(108) d(100)(20320)(22909)
H(72) e(101) l(108) l(108) o(111)  (32) å(229) (151) ¨(168)

因为一个byte类型的数据仅能表示8位二进制数(256个),一个汉字无法通过一个字节来表示,程序将一个汉字对应的二进制拆分为了3个byte类型数据了。而rune类型(uint32)能够表示32位二进制数,能够表示一个汉字字符所对应的二进制数字,所以不会出现乱码问题。

字符串拼接

①+运算符拼接

	// 1.+号拼接
	s1 := "Hello"
	s2 := "world"
	s := s1 + " " + s2
	fmt.Println(s)
Hello world

②Sprintf拼接

	// 2.Sprintf 拼接
	s1 := "Hello"
	s2 := "world"
	s := fmt.Sprintf("%s %s", s1, s2)
	fmt.Println(s)
Hello world

字符串分割

strings.Split()
按照指定子串对字符串进行分割,返回string类型切片

	s := `Hello\world`
	split := strings.Split(s, `\`)
	fmt.Printf("%T\n", split)
	fmt.Println(split)
[]string
[Hello world]

是否包含某子串

strings.Contains()
按照指定子串查找字符串是否包含该子串,返回bool类型

	s := "Hello world"
	fmt.Printf("%T\n", strings.Contains(s, " "))
	fmt.Println(strings.Contains(s, " "))
bool
true

前后缀判断

strings.HasPrefix() 判断前缀
strings.HasSuffix() 判断后缀

	s := "Hello world"
	fmt.Println(strings.HasPrefix(s, "Hello"))
	fmt.Println(strings.HasSuffix(s, "world"))
true
true

子串出现位置

strings.Index()
若找到子串,返回子串第一个字符的下标
若没有找到,返回-1

	s := "Hello world"
	fmt.Println(strings.Index(s, "o w"))
	// 未找到子串返回-1
	fmt.Println(strings.Index(s, "*"))
4
-1

join拼接

strings.Join()
对一个string类型切片使用指定字符串进行拼接

	// join 拼接
	s := `Hello\world`
	split := strings.Split(s, `\`)
	fmt.Println(strings.Join(split, "+"))
Hello+world

字符串无法直接修改

Go语言中,字符串无法直接修改,无法通过下标直接修改字符串中的某个字符,必须先将字符串转换位rune类型的切片才可以

	s1 := "魚禾"
	// 报错
	// s1[0] = "鱼"
	// 转换成rune切片
	s := []rune(s1)
	// s[0]属于字符型,使用单引号
	// s[0] = "鱼"
	s[0] = '鱼'
	// 重新转换为string
	s1 = string(s)
	fmt.Println(s1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值