当前位置: 首页 > news >正文

GO学习日志07

1、字符串类型

在Go语言中,string是一种不可变的字节序列,用于表示文本数据。每个字符串由字节组成,通常以UTF-8编码存储Unicode字符。字符串的长度可以通过内置的len()函数获取,返回的是字节数而非字符数。

字符串的特点包括:

  • 不可变性:一旦创建,字符串内容无法修改。
  • 支持索引访问:可以通过索引访问字节(如s[i]),但无法直接修改。
  • 支持切片操作:通过切片语法(如s[start:end])获取子串。
  • 原生支持Unicode:无需额外处理多字节字符。
package main import "fmt" func main(){ var n string = "你好 golang" //注意被双引号标注 fmt.Printf("%v---%T\n",n,n) //输出:你好 golang---string /*双引号内容可以视为字符串,但是如果有些特殊符号需要被标注如何? 比如输出"this is str" 这里就包含一个换行和两个双引号 这里就需要转义字符 */ str := "\"this \nis str\" " fmt.Println(str) }

转义字符表格

以下是Go语言中常见的转义字符及其描述:

转义字符描述
\a响铃(ASCII码7)
\b退格(ASCII码8)
\f换页(ASCII码12)
\n换行(ASCII码10)
\r回车(ASCII码13)
\t水平制表符(ASCII码9)
\v垂直制表符(ASCII码11)
\\反斜杠
\'单引号(仅用于rune字面量)
\"双引号(仅用于字符串字面量)

多行字符串

Go语言支持反引号(`)定义的原始字符串字面量,内容不进行转义处理,可以用于多行字符串输入,输出格式保持不变:

package main import "fmt" func main(){ str := `this is str1 this is str2 this is str3 this i s s t r 4 ` //注意反引号在tab键上方 fmt.Println(str) /*输出: this is str1 this is str2 this is str3 this i s s t r 4 */ }

常用字符串处理方法

方法/函数功能描述示例代码
len(str)返回字符串的字节长度(非字符数)len("Go语言")→ 6(UTF-8编码下中文占3字节)
utf8.RuneCountInString返回字符串的Unicode字符数utf8.RuneCountInString("Go语言")→ 4
strings.Contains检查字符串是否包含子串strings.Contains("hello", "ell")→ true
strings.HasPrefix检查字符串是否以指定前缀开头strings.HasPrefix("go-code", "go")→ true
strings.HasSuffix检查字符串是否以指定后缀结尾strings.HasSuffix("main.go", ".go")→ true
strings.Index返回子串首次出现的索引(字节位置)strings.Index("chicken", "ken")→ 4
strings.LastIndex返回子串最后一次出现的索引strings.LastIndex("go gopher", "go")→ 3
strings.Replace替换字符串中的子串(可指定替换次数)strings.Replace("oink oink", "k", "ky", 2)→ "oinky oinky"
strings.ToLower将字符串转为小写strings.ToLower("Gopher")→ "gopher"
strings.ToUpper将字符串转为大写strings.ToUpper("Gopher")→ "GOPHER"
strings.TrimSpace去除字符串首尾的空白字符strings.TrimSpace(" hello ")→ "hello"
strings.Trim去除字符串首尾指定字符strings.Trim("¡hello!", "¡!")→ "hello"
strings.Split按分隔符拆分字符串为切片strings.Split("a,b,c", ",")→ ["a", "b", "c"]
strings.Join将字符串切片合并为一个字符串strings.Join([]string{"a","b"}, "-")→ "a-b"
strings.Fields按空白字符分割字符串为切片strings.Fields(" foo bar ")→ ["foo", "bar"]
strconv.Itoa整数转字符串strconv.Itoa(123)→ "123"
strconv.Atoi字符串转整数(需错误处理)strconv.Atoi("123")→ 123
[]rune(str)将字符串转换为Unicode码点切片[]rune("语言")→ [35821, 35328]
string([]byte{...})字节切片转字符串string([]byte{104, 101, 108, 108, 111})→ "hello"
strings.Repeat重复字符串指定次数strings.Repeat("na", 3)→ "nanana"
strings.Compare按字典序比较两个字符串(通常直接使用==>等运算符更高效)strings.Compare("a", "b")→ -1
strings.Count统计子串出现次数strings.Count("cheese", "e")→ 3
strings.Title将每个单词首字母转为大写(已弃用,推荐使用cases.Titlestrings.Title("her royal highness")→ "Her Royal Highness"

注意事项

  • 涉及中文字符处理时,优先考虑[]rune转换或utf8包相关函数
  • 中文一个字符占用3字节
  • 字符串不可变,所有修改操作都会返回新字符串
  • 性能敏感场景建议使用bytes.Bufferstrings.Builder进行字符串拼接

len()求长度

package main import "fmt" func main(){ str1 := "this is str" //一个空格也算 str2 := "你好" //一个中文字符占3字节 fmt.Println(len(str1)) //11 fmt.Println(len(str2)) //6 }

+或fmt.Sprintf拼接字符串

package main import "fmt" func main(){ str1 := "this is str" //一个空格也算 str2 := "你好" //一个中文字符占3字节 fmt.Println(str1+str2) //this is str你好 无缝衔接 str3 := fmt.Sprintf("%v %v",str1,str2)//先将两个字符串格式化输出,然后保存至str3 fmt.Println(str3) //this is str 你好 //还可以拼接长文本 str4 := "你是一个讨人喜欢"+ "白白嫩嫩"+"活泼可爱"+"双马尾"+"大雷"+ "漂亮女孩" fmt.Println(str4) //你是一个讨人喜欢白白嫩嫩活泼可爱双马尾大雷漂亮女孩 }

Split分割

这里要求导入strings包,可以在包前加入_取消引用

package main import ( "fmt" "strings" ) func main(){ str1 := "123-456-789" arr := strings.Split(str1,"-") //第一个参数表示分割的字符串,第二个参数表示分割规则 fmt.Println(arr) //[123 456 789] }

注意:此时的arr是一个切片,在go里,切片类似数组

Join连接切片

package main import ( "fmt" "strings" ) func main(){ str1 := "123-456-789" arr := strings.Split(str1,"-") //第一个参数表示分割的字符串,第二个参数表示分割规则,返回切片 fmt.Println(arr) //[123 456 789] 这里的arr已经分为三个切片 str2 := strings.Join(arr,"*") //第一个参数表示需要拼接的切片,第二个表示拼接规则,返回字符串 fmt.Println(str2) //123*456*789 }
package main import ( "fmt" "strings" ) func main(){ arr := []string{"java","c++","python"} //这里是字符串数组或者字符串切片定义方式 str := strings.Join(arr,"-") fmt.Println(str) //java-c++-python }

contains包含

package main import "fmt" import "strings" func main(){ str1 := "Hello, World!" str2 := "He" flag := strings.Contains(str1,str2) //检测str1中是否包含str2 fmt.Println(flag) //true }

HasPrefix前缀和HasSuffix后缀

package main import "fmt" import "strings" func main(){ str1 := "Hello, World!" str2 := "He" flag := strings.HasPrefix(str1,str2) //检测str1是否以str2开头 fmt.Println(flag) //true str3 := "ld!" flag2 := strings.HasSuffix(str1,str3) //检测str1是否以str3结尾 flag1 := strings.HasSuffix(str1,"!") //检测str1是否以"!"结尾 fmt.Println(flag1) //true fmt.Println(flag2) //true }

Index和LastIndex

package main import "fmt" import "strings" func main(){ str1 := "Hello, World!" str2 := "Wo" str3 := "l" num := strings.Index(str1, str2) //返回字符串str2在str1中第一次出现的位置,如果没有找到则返回-1 //返回的是下标,从0开始计数,从左往右数 fmt.Printf("The index of '%s' in '%s' is: %d\n", str2, str1, num) //The index of 'Wo' in 'Hello, World!' is: 7 num1 := strings.LastIndex(str1, str3) //返回字符串str2在str1中最后一次出现的位置,如果没有找到则返回-1 //返回的是下标,从0开始计数,从左往右数 fmt.Printf("The last index of '%s' in '%s' is: %d\n", str3, str1, num1) //The last index of 'l' in 'Hello, World!' is: 10 }
http://www.jsqmd.com/news/492845/

相关文章:

  • 永磁同步电机FOC矢量控制仿真探索:从无感到闭环启动
  • 《QGIS快速入门与应用基础》221:项目面板:布局元素管理
  • deer-flow2本地启动(无make无nginx启动)
  • 滑模控制:解锁复杂系统控制的密码
  • SWD/JTAG Communication Failure的解决方法
  • MATLAB 分步傅里叶法仿真光纤激光器锁模脉冲产生:攻克脉冲漂移难题
  • 地下排水管道缺陷数据集 水下管道缺陷识别 智能识别之管道缺陷识别 管道油污碎屑 结垢沉积物识别 根系侵入数据集 表面损伤、破裂的管道、破裂图像数据集-目标检测图像数据集第10112期
  • YOLO系列算法改进 | 主干改进篇 | 替换MobileViGv2可缩放图卷积网络 | 助力模型复杂场景下精细区分目标和理解空间关系 | CVPR 2024
  • Prescan与Simulink联合仿真AEB模型:实现自动避撞停车
  • 泊车路径规划:几何方法实现的魅力
  • Deeplab - v3与ISIC皮肤病分割数据集实战
  • COMSOL:木材吸水(毛细效应)模型介绍
  • Android 硬件测试全流程方法论 —— 从性能、功耗到稳定性(测试工程师必看)
  • 多语言编程:Yi-Coder-1.5B支持52种语言实战演示
  • 探索一维光子晶体超窄带滤波器:从光学仿真到Matlab实现
  • 【RAG】【Data-Processor】【node_parsers04】SlideNodeParser文档解析示例
  • 挑选AI外包团队的“五看一评”标准,帮你避开90%的坑
  • 【RAG】【Data-Processor】【node_parsers05】TopicNodeParser主题解析示例
  • USB 5V电表设计:基于N32G430与INA199的嵌入式电源监测方案
  • AI投资回报率的“三维度”评估法:不只算钱,更要算清这些隐性价值
  • 融合正余弦和柯西变异的麻雀搜索算法优化CNN - BiLSTM
  • 机器视觉学习总结
  • ENSP模拟验证VLAN不同端口类型对数据帧的收发情况
  • SiameseAOE实战:快速分析餐厅/酒店/商品评论,小白也能搞定
  • 功率分流混联式混合动力车辆热管理建模与性能计算分析,对标丰田混合动力EVT构型,利用Simul...
  • WPF implement ICommand with async execute
  • 基于Qwen3-ForcedAligner-0.6B的智能字幕生成系统:SpringBoot整合实战
  • 【2026年拼多多春招- 3月15日 -第三题- 多多的配送轨迹】(题目+思路+JavaC++Python解析+在线测试)
  • Gateway 服务器 WebSocket 创建与处理流程分析
  • STM入门(12)