对字符串进行修改【对于非中文字符串转byte[]切片,对于包含中文字符串转rune[]切片】
string是不可变,因此我们不能直接对string中的某一个字符修改
要修改string的某个字符可以 先把string转换为byte[]切片或者rune[]切片,然后对切片进行修改,最后将切片转为string
string[m:n]表示截取string的下标m到下标n-1的子串
func main() {//string底层是一个byte数组,因此string也可以进行切片处理str := "hello@atguigu"//使用切片获取到 atguigustr2 := str[6:] // 这里得到的是一个子串,左闭右开fmt.Println("str2=", str2)fmt.Printf("str2 type = %T\n", str2)//string是不可变的,也就说不能通过 str[0] = 'z' 方式来修改字符串//str[0] = 'z' [编译不会通过,报错,原因是string是不可变]//如果需要修改字符串,可以先将string -> []byte 或者 []rune -> 修改 -> 重写转成string//"hello@atguigu" =>改成 "zello@atguigu"arr1 := []byte(str)arr1[0] = 'z'str = string(arr1)fmt.Println("str=", str)// 细节,我们转成[]byte后,可以处理英文和数字,但是不能处理中文// 原因是 []byte 字节来处理 ,而一个汉字,是3个字节,因此就会出现乱码// 解决方法是 将 string 转成 []rune 即可, 因为 []rune是按字符处理,兼容汉字arr2 := []rune(str)arr2[0] = '北'str = string(arr2)fmt.Println("str=", str)}
结构体和字符串的序列化和反序列化
对结构体进行序列化的要求结构体的字段的首字母大写(即可导出的属性才能被序列化)
对于结构体中每一个字段需要增加一个json的标签,在序列化和反序列化的过程中会采用这个标签值作为json的key
package mainimport "fmt"import "encoding/json"// 后面的`json:"name"`在进行序列化和反序列化的时候会使用这个leytype Monster struct {Name string `json:"name"` // `json:"name"` 就是 struct tagAge int `json:"age"`Skill string `json:"skill"`}func main() {//1. 创建一个Monster变量monster := Monster{"牛魔王", 500, "芭蕉扇~"}//2. 将monster变量序列化为 json格式字串// json.Marshal 函数中使用反射,这里的jsonStr是一个byte[]切片jsonStr, err := json.Marshal(monster)if err != nil {fmt.Println("json 处理错误 ", err)}//jsonStr {"name":"牛魔王","age":500,"skill":"芭蕉扇~"}fmt.Println("jsonStr", string(jsonStr))monsterTmp := Monster{}// Unmarshal第一个类型是[]byte切片,第二个类型是地址err = json.Unmarshal(jsonStr, &monsterTmp)if err != nil {fmt.Println("凡序列化失败")} else {//类型是 main.Monster,值是{牛魔王 500 芭蕉扇~}fmt.Printf("类型是 %T,值是%v \n", monsterTmp, monsterTmp)}}
golang中对结构体绑定方法
方法绑定有两种方式
与这个结构体变量进行绑定 【结构体变量是进行值拷贝】,即方法中对这个结构体的字段赋值不会改变外部调用这个方法的结构体
与这个结构体变量的地址进行绑定 【结构体变量是进行地址的拷贝】 项目中推荐使用
type Circle struct {radius float64}// 这个方法area绑定的是Circle这个结构体,但结构体变量是进行的值拷贝// 即area内部对c的成员做修改不会影响外部func (c Circle) area() float64 {return 3.14 * c.radius * c.radius}// 这个area2方法绑定的是Circle这个结构体,但结构体变量是进行地址的拷贝// 即内部对c的成员进行修改会影响外部// c.radius在go的编译器底层会进行优化,优化成(*c).radius// 在开发过程中常用地址类型的绑定方式,因为效率高且可以影响外部func (c *Circle) area2() float64 {c.radius = 10return 3.14 * c.radius * c.radius}func main() {//创建一个Circle 变量var c Circlec.radius = 4.0res := c.area()fmt.Println("面积是=", res)//创建一个Circle 变量var c2 Circlec2.radius = 7.0// c2.area2()编译器底层做了优化,优化成了(*c2).area2()res2 := c2.area2()fmt.Println("面积=", res2)fmt.Println("c2.radius = ", c2.radius) //10}
算法vip班级永久刷题班~~
奔跑的小梁,公众号:梁霖编程工具库算法训练营golang专题刷题来啦!!!!