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 截取出来了

image.png

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

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

image.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,输出结果如下

image.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)

}

执行结果如下:

image.png

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

相关文章
|
4月前
|
存储 Java 对象存储
String str="Hello" 与 String str=new String(“Hello”)一样吗?
String str="Hello" 与 String str=new String(“Hello”)一样吗?
|
11月前
|
Java
每天一道面试题之String str=“i“与 String str=new String(“i”)一样吗?
每天一道面试题之String str=“i“与 String str=new String(“i”)一样吗?
|
C# 索引
C#基础⑨——字符串(string str = null 与string str = ““的区别)
字符串数组变字符串(字符串数组变新的字符串数组)
【剑指offer知识点】List转int[],List转String,String转int,char[]转String,String 转char[],List转String[]
【剑指offer知识点】List转int[],List转String,String转int,char[]转String,String 转char[],List转String[]
116 0
|
Go 开发者
string 和 slice|学习笔记
快速学习 string 和 slice
68 0
string 和 slice|学习笔记
|
Go
go语言map[string]string 转map[string]interface{}
go语言map[string]string 转map[string]interface{}
700 0
|
C++
C++ string.find()函数
C++ string.find()函数
152 0
|
安全 Java 索引
Java底层源码——Arrays.toString(数组) & object.toString() & new String()
Java底层源码——Arrays.toString(数组) & object.toString() & new String()
95 0
每天一个知识点(二)String str=“i”与 String str=new String(“i”)一样吗?
不一样,使用String str="i",java虚拟机会把它分配到常量池中,而 String str=new String(“i”)创建了一个对象,会被分到堆内存中。