golang中对字符串修改操作和序列化

简介: golang中对字符串修改操作和序列化

公众号merlinsea


  • 对字符串进行修改【对于非中文字符串转byte[]切片,对于包含中文字符串转rune[]切片】
  • string是不可变,因此我们不能直接对string中的某一个字符修改
  • 要修改string的某个字符可以 先把string转换为byte[]切片或者rune[]切片,然后对切片进行修改,最后将切片转为string
  • string[m:n]表示截取string的下标m到下标n-1的子串


func main() {
   //string底层是一个byte数组,因此string也可以进行切片处理
   str := "hello@atguigu"
   //使用切片获取到 atguigu
   str2 := 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 main
import "fmt"
import "encoding/json"
// 后面的`json:"name"`在进行序列化和反序列化的时候会使用这个ley
type Monster struct {
   Name  string `json:"name"` // `json:"name"` 就是 struct tag
   Age   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 = 10
   return 3.14 * c.radius * c.radius
}
func main() {
   //创建一个Circle 变量
   var c Circle
   c.radius = 4.0
   res := c.area()
   fmt.Println("面积是=", res)
   //创建一个Circle 变量
   var c2 Circle
   c2.radius = 7.0
   // c2.area2()编译器底层做了优化,优化成了(*c2).area2()
   res2 := c2.area2()
   fmt.Println("面积=", res2)
   fmt.Println("c2.radius = ", c2.radius) //10
}


  • 算法训练营永久vip学习班【目前主要采用的编程语言是go语言】golang算法训练营报名详情如下,快加入我们吧,永久授课和学习,我自己负责的课程会一直维护下去~


算法vip班级永久刷题班~~

奔跑的小梁,公众号:梁霖编程工具库算法训练营golang专题刷题来啦!!!!
相关文章
|
6月前
|
NoSQL 测试技术 Go
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
|
2月前
|
JSON Go 数据格式
Golang语言结构体链式编程与JSON序列化
这篇文章是关于Go语言中结构体链式编程与JSON序列化的教程,详细介绍了JSON格式的基本概念、结构体的序列化与反序列化、结构体标签的使用以及如何实现链式编程。
39 4
|
2月前
|
Go
Golang语言基本数据类型默认值及字符串之间互相转换案例
这篇文章讲解了Golang语言中基本数据类型的默认值、类型转换的概述以及整型、浮点型、字符串之间的相互转换案例,包括如何将基本数据类型转换为字符串类型和字符串类型转换为基本数据类型,以及字符串与字节切片之间的转换。
18 2
|
2月前
|
Go
Golang语言基础数据类型之字符串常用的操作
这篇文章介绍了Golang语言中字符串的定义、常用操作,包括字符串长度查看、遍历、类型转换、子串统计、比较、查找位置、替换、切割、大小写转换、剔除字符、前缀后缀判断、拼接、子串包含判断以及字符串join操作,同时提供了官方文档的查看方法。
21 1
|
3月前
|
Go
[golang]字符串拼接
[golang]字符串拼接
|
3月前
|
存储 程序员 编译器
Golang 中的字符串:常见错误和最佳实践
Golang 中的字符串:常见错误和最佳实践
|
3月前
|
Go 开发者
|
4月前
|
分布式计算 DataWorks NoSQL
MaxCompute操作报错合集之序列化过程中遇到报错,是什么问题
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
5月前
|
Go
【golang】golang 字符串切片排序
【golang】golang 字符串切片排序
67 1
|
5月前
|
Go
【golang】Go 判断字符串是否包含指定字符
【golang】Go 判断字符串是否包含指定字符
78 1