Go语言基础、实战 -- 6. 字符串

1. 什么是字符串?

    在Go中字符串是byte数组。可以通过将内容放在 " "之间的方式来创建一个字符串。如下:

s := "I am string"

    Go中的字符串符合Unicode标准,并以UTF-8编码。

2. 访问字符串中的字节、遍历

    因为字符串实际上是byte数组,所以可以通过下标访问一个字符串的单个字节,也可以遍历。如下:

str := "Hello World"
for i, v := range str {
    fmt.Printf("[%d] : %c\n", i, v)
}

for i:=0; i<len(str); i++ {
    fmt.Printf("[%d] : %c\n", i, str[i])
}

3. 通过byte切片来创建字符串

    注意:数组不可以用来创建字符串。 

// 通过byte切片创建字符串
byteSlice := []byte{0x43, 0x61, 0x66, 0xc3, 0xA9}    // 这里用对应的十进制数同样ok
str := string(byteSlice)        // 这里如果传的是数组,而不是切片,会报错

4. 潜在的隐患 -- 打印输出

str := "Señor"
for i:=0; i<len(str); i++ {
    fmt.Printf("%c ", str[i])
}
fmt.Printf("\n")	//输出结果为:S e à ± o r

    由于 ñ 的Unicode码点是 U+00F1,它的UTF-8编码占了两个字节。所以试图将两个字符当做一个字符来打是错误的。这时候可以用rune来解决这个问题,它是Go中的一种字符类型。

5. 字符类型

    在Go语言中支持两种字符类型:

    -- byte:代表单个UTF-8字符串的字节

    -- rune:代表单个Unicode的字符

    现在用rune类型对上面的代码进行修改:

//rune解决隐患
str := "Señor"
str_rune := []rune(str)
for i:=0; i<len(str_rune); i++ {
    fmt.Printf("%c ", str_rune[i])
}
fmt.Printf("\n")	//输出结果为:S e ñ o r

    对于字符串str,获取它的长度:

//字符串长度
str := "Señor"
fmt.Println("length of utf-8:", utf8.RuneCountInString(str))    //输出结果为:length of utf-8: 5
fmt.Println("length of byte:", len(str))                        //输出结果为:length of byte: 6

    可以看到,如果字符串中有这种实际占了两个字节的字符,那么就要用rune来处理了,否则会出错。

6. 修改字符串的值

    不可以通过下标来修改字符串中的字符,因为创建的字符串是不可变的。

    但可以将字符串变量整个重新赋值:

str := "Hello World"
//str[0] = 'Y'        // 非法
str = "Yello World"     // 正确

    如果有需要改变一个字符串中单个字符的需求,通过rune来实现:

//通过rune修改字符串
str := "Hello World"
new_str := []rune(str)
new_str[0] = 'Y'
str = string(new_str)
fmt.Println(str)

7. 截取字符串

    截取英文的字符串:

//截取字符串
sourceStr := "XHelloWorldX"
str := sourceStr[1:len(sourceStr)-1]	//输出结果为:HelloWorld (开始的下标,结束的后一位的下标)
fmt.Println(str)

    如果是中文,还是用rune:

//截取字符串--中文
source := "AB我透你CD"
str := string([]rune(source)[2:5])
fmt.Println(str)						//输出结果为:我透你

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值