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.Title) | strings.Title("her royal highness")→ "Her Royal Highness" |
注意事项
- 涉及中文字符处理时,优先考虑
[]rune转换或utf8包相关函数 - 中文一个字符占用3字节
- 字符串不可变,所有修改操作都会返回新字符串
- 性能敏感场景建议使用
bytes.Buffer或strings.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 }