开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:快速学习 string 和 slice】与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9643
快速学习 string 和 slice
一、string 和 slice 的关系
1.String在操作时的特点
(1)string 底层是一个 byte 数组,因此 string 也可以进行切片处理
案例演示:
新建一个文件叫 mian.go,粘贴共用的代码;
package main
import (
"fmt"
func main(){
//string 底层是一个 byte 数组,因此 string 也可以进行切片处
str := "hello@atguigu”
//使用切片获取到atguiguslice := str[6:]
//数a是str中的第几个元素,a是第7个元素,它的下标就是6
后面不写,因为后面采用默认值就是将后面的元素全部切过来
fmt.Printin("slice=", slice)
}
执行结果如下:可以看到 atguigu 截取出来了
如果以后想要对一个数组进行截取,比如从一个数组的第几位元素到多少就可以用切片的方式
(2)string 和切片在内存的形式,以"abcd”画出内存示意图
如图中所示:
因为字符串的底层是一个 byte 数组,所以图中 abcd 是一个 byte 数组;如果是一个字符串str,它是的本质也是一个切片,它的ptr也是指向 abcd 的,就像一个切片,并且有地址是指向 byte 数组的首地址;同时还有一个部分表示这个数组的长度;同样,如果是切片,假设有一个切片是 slice=string[1,3],那同样这个切片也有一个指针指向原来数组的第二个元素的地址,b c 是 slice 的内容,len便是它的长度只有一个
结论:字符串底层是一个 byte,str 其实也是一个切片,正因为它是一个切片,所以它也可以用切片相关的方法和函数
(3)string 是不可变的,也就说不能通过 str[o]= ‘z'方式来修改字符串(如果想通过以上方式修改字符串,是会报错的。因为String本身不可变)【演示】
fmt.Println( "slice=", slice)
str[0] =
‘
z
’
//编译不会通过,报错,原因是因为 string 是不可变的
}
//将“h”改成“z”,但一保存后就会报错,报错原因就是不可以分配str[0],也就是不可以给他它赋值,因此写法错误
(4)(如果确实有需求改变字符串便可以运用以下步骤)如果需要修改字符串,可以先将string -> []byte/或者[rune->修改→重写转成
string.(先转成一个切片,修改完后,再重新转成一个字符串)
【演示+说明】
//如果需要修改字符串,可以先将string ->[]byte /或者[]rune ->修改-〉重写转成string
//
"hello@atguigu”=>改成“zello@atguigu”
将它改成一个byte数组而不是切片,直接转
arri := []byte(str)
//转成了一个byte切片
arr1[0]=
‘z’
//在切片中改成一个z
str = string(arr1)
//重新转成一个字符串
fmt.Println( "str=", str)
//再输出 string,那么 hello 中第一个字母为 z,输出结果如下:
注意:转成[ ]byte 后,可以处理英文和数字,但是不能处理中文,原因是[]byte字节来处理,而一个汉字,是3个字节,因此就会出现乱码
运用以上代码,将arr1[0]=
‘z’
换成arr1[0]=
‘北’
,输出结果直接报错,因为‘北’的编码是21271,而 byte 的范围只有255装不下汉字的编码//解决方法是将 string 转成〔]rune 即可,因为[]rune是按字符处理,兼容汉字
arri :=[]rune(str)
//将byte换成rune
arr1[0]="北'
str = string(arr1)
fmt.Println( "str=", str)
}
执行结果如下:
这块讲的是如果以后要修改字符串应该怎么处理的方案;即要对字符串进行修改或处理直接转成 rune 这种切片,改完再转回即可;如果在处理二进制编码,便将它转为 byte 类型,然后再进行数据的传输和处理,如果是显示时,就用 rune 切片