string 和 slice|学习笔记

简介: 快速学习 string 和 slice

开发者学堂课程【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 截取出来了

3dbf6e3824184cb9b21b323585c30fde.png

如果以后想要对一个数组进行截取,比如从一个数组的第几位元素到多少就可以用切片的方式

(2)string 和切片在内存的形式,以"abcd”画出内存示意图

76f508134771461baaa2b1e000f411ae.png

如图中所示:

因为字符串的底层是一个 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,输出结果如下

adb554155173430bbae5ebae60f0a67f.png

注意:转成[ ]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)

}

执行结果如下:

adb554155173430bbae5ebae60f0a67f.png

这块讲的是如果以后要修改字符串应该怎么处理的方案;即要对字符串进行修改或处理直接转成 rune 这种切片,改完再转回即可;如果在处理二进制编码,便将它转为 byte 类型,然后再进行数据的传输和处理,如果是显示时,就用 rune 切片

相关文章
|
2月前
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
3月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
43 0
|
5月前
|
编译器 C++
【C++】学习笔记——string_5
【C++】学习笔记——string_5
23 0
|
5月前
|
编译器 C语言 C++
【C++】学习笔记——string_4
【C++】学习笔记——string_4
27 0
|
5月前
|
C语言 C++
【C++】学习笔记——string_3
【C++】学习笔记——string_3
27 0
|
5月前
|
存储 编译器 C++
【C++】学习笔记——string_2
【C++】学习笔记——string_2
29 0
|
5月前
|
算法 C++ 容器
【C++】学习笔记——string_1
【C++】学习笔记——string_1
27 0
|
6月前
|
Java Redis
redis-学习笔记(Jedis string 简单命令)
redis-学习笔记(Jedis string 简单命令)
42 2
|
6月前
|
NoSQL Java Redis
redis-学习笔记(string , hash , list , set , zset 前置知识)
redis-学习笔记(string , hash , list , set , zset 前置知识)
34 0
redis-学习笔记(string , hash , list , set , zset 前置知识)
|
6月前
|
存储 NoSQL Java
redis-学习笔记(string)
redis-学习笔记(string)
36 0