开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: Go 字符串函数详解(1)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9615
Go 字符串函数详解(1)
基本内容
一.统计字符串的长度,按字节 len(str)
二.子符串遍历,同时处理有中文的回题 r :=[]rune(str)
三.字符串转整数: n,err := strconv.Atoi("12")
四.整数转字符串 str = strconv.Itoa(12345)
五.字符串转 [ ]byte: var bytes = [ ]byte("hello go")
六.[ ] byte 转字符串: str = string([]byte{97,98,99})
七.十进制转 2,8,16 进制: str = strconvFormatInt(123,2)
八.查找子串是否在指定的字符串中: strings.Contains ("seafood", "foo")
九.统计个字符串有几个指定的子串: strings.count(" ceheese","e")
十.不区分大小写的字符串比较(==是区分字母大小写的): fmt. Println(strings.EqualFold( "abc")
十一.返回子串在字符串第一次出现的index值,如果没有返回-1
说明:字符串在我们程序开发中,使用的是非常多的,常用的函数需要掌握。这是 golong 的设计者事先就准备好的,在字符串中提供的函数,一共整理了 21 个。手册怎么去看,打开百度搜索 GO 官方文档,函数库全在里面,当需要用的时候,可以查看相关文档。
一.统计字符串的长度,按字节 len(str)
1、这个函数是一个内嵌函数,它不在包中,可以直接使用,不需要引入特别的包,内建函数在手册中可以查,点击 builtin,builtin 中有许多内建函数如 make、cap、len、copy、close、recover 都是内建函数。len 是一个内建函数,返回的是 V 的长度,取决于 V 的类型。最常用的是计算字符串或者数组的长度。
2、案例代码
package main
import (
"fmt"
)
func main(){
//统计字符串的长度,按字节 len(str)
// golang 的编码统一为 urf-8( ascii 的字符)占一个字节,汉字占 3 个字节
str = "hello北"
fmt.Println( "str len=", len(str))
/ /8
}
3、结果输出:
8
4、代码分析:
有个字符串 str:=”hello”
直接输出这个长度 f
mt.Println( "str len=", len(str))
,没有引别的包,直接使用。结果输出 5,如果str:=”hello北”
有中文,会输出 8,因为 golang 的编码统一为 urf-8( ascii 的字符)占一个字节,汉字占 3 个字节,所以输出的就是 8。从而说明 len 是按字节返回,并不是按字符。 len 除了可以统计字符串,还可以统计数组的大小。
二.子符串遍历,同时处理有中文的回题 r :=[]rune(str)
1、如果一个字符串中含有中文,需要先把它转成 rune 的切片,然后再对返回的变量进行遍历,这样就不会出现中文乱码,如果不这样处理会发现乱码。
2、案例代码
package main
import (
"fmt"
)
func main(){
str2 := "hello北京”
//字符串遍历,同时处理有中文的问题 r := []rne(str)
r := [ ]rune(str2)
for i := 0; i < len(r); i++ {
fmt.Printf("字符=%c\n", r[i])
}
3、结果输出为
4、代码分析:
str2:=”hello北京”
把这个字符串中的每个字符打印出来,可以进行遍历 for i := 0; i < len(r); i++
,然后再进行输出 fmt.Printf("字符=%c\n", r[i])i 代表的是从 0 开始编号的第几个,运行后发现打印的全是数字,但是要按照字符输出,需要进行格式化处理,将 V 改成 C 后,前面的输出正确,但是是按字节遍历,一个汉字占 3 个字节,后面的不行。加一条语句 r := [ ]rune(str2)
,这个字符遍历转成 rune 的切片后,就按字符来遍历。最后结果不会再乱码,如果要遍历含有中文的字符串,先把它转成 rune 的切片。
三.字符串转整数: n,err := strconv.Atoi("12")
1、Atoi 是 Parselnt(s,10,O) 的简写。如果需要把字符串转成整数,前提是可以转,如果转不成功的话,err 会打印错误,可以对err进行一个判断。手册中 strconv 这个包,在里面搜索 Atoi,Atoi是传一个字符串转成 int,如果转不成功,err 就会有值
2、案例代码
package main
import (
"fmt"
)
func main(){
n, err := strconv.Atoi( "123")
if err != nil {
fmt.Println(”转换错误",err)
}else {
fmt.Println(”转成的结果是”,n)
}
3、输出的结果是:
转换的结果是 123
4、代码说明:
if err != nil {则转换错误,错误的原因可以打印出来 fmt.Println (”转换错误",err),如果没有错误,n 就是值,fmt.Println (”转成的结果是”,n )这个 n 就是个整数,需要引入一个新的包 strconv,最后结果转换成功,如果将 123 换成 hello,err 就会出现不等于 nil,结果会输出转换错误。可以利用这个特性来对一个数据类型进行校验,比如在输入时要求必须输入数字字符串,如果不输,验证出来给相应的提示。
四.整数转字符串 str = strconv.Itoa(12345)
1、整数是一定可以转成字符串,可以直接转。
2、案例代码
package main
import (
"fmt"
)
func main(){
str = strconv.Itoa(12345)
fmt.Printf("str=%v, str=%T", str,str)
}
3、输出结果:
str=12345,srt=string
4、代码说明:
输出 fmt.Printf("str=%v, str=%T", str,str)
类型是 %T,转完之后把值输出,类型也输出,在结果中可以看到 str=12345,srt=string
类型是 string。
五.字符串转 [ ]byte: var bytes = [ ]byte("hello go")
1、有一个字符串,需要把字符串写入二进制文件,那这个字符串需要把它转成 byte ,数据类型才能匹配。
2、案例代码:
package main
import (
"fmt"
)
func main(){
var bytes = [ ]byte("hello go")
fmt.Printf( "bytes=%v\n", bytes)
}
3、输出结果:
bytes=[104 101 108 108 111 32 103 111]
4、代码说明:
直接输出,输出的时候按 bytes 本身的值输出,输出的是 h 对应的 assic 码,对应的是 assic 的编码。
六.[ ] byte 转字符串: str = string([]byte{97,98,99})
1、有时候给了一个 byte 切片或者数组需要把它转成一个字符串,因为需要按字符串的输出。
str = string([ ]byte{97,98,99})
fmt.Printf("str=%v\n", str)
2、代码说明:
把 97、98、99 都转成对应的字符,并且组成一个字符串返回,最后打印出来的是 97、98、99、对应的字符,形成一个字符串。最后输出的是 abc,为什么是 abc,因为 a 对应的 assic 码就是 97,b 对应 98、c 对应 99。
七.10 进制转 2,8,16 进制: str = strconvFormatInt(123,2) // 2->8,16
1、需要把一个十进制的数转成二进制、八进制或者是十六进制,可以用 str = strconvFormatInt 这么一个函数来完成,查文档也是点击 strconv,搜索 FormatInt,base 中可以写 2/8/16 转成对应的值,然后返回一个字符串。传入的参数是 int64,返回的是字符串。
2、案例代码:
package main
import (
"fmt"
)
func main(){
str = strconv.FormatInt(123,2)
fmt.Prinf( "123对应的二进制是=%v\n", str)
str = strconv.FormatInt(123,16)
fmt.Printf( "123对应的16进制是=%v\n", str)
3、输出结果:
123 对应的二进制是 =1111011
123 对应的 16 进制是 =7b
八.查找子串是否在指定的字符串中: strings.Contains ("seafood", "foo") //true
1、Contains 函数第一个传的是字符串,第二个传的是子字符串,也就是看在seafood 字符串里面,有没有 foo,如果有返回真,没有返回假。在文档中需要重新找一个包叫 strings,搜索 Contains ,判断字符串 s 是否包含子串 substr 。
2、案例代码:
package main
import (
"fmt"
)
func main(){
//查找子串是否在指定的字符串中: strings.Contains("seafood", "foo")
// true
b:= strings.Contains( "seafood", "foo")
fmt.Printf( "b=%v\n", str)
}
3、输出结果:
b=true
4、代码分析:
需要引入 strings 这个包在进行字符串处理的时候经常用到,b 接收一个值 b:= strings.Contains( "seafood", "foo")
,输出 b 等于fmt.Printf( "b=%v\n", str)
,seafood 里面有 foo,所以返回真。如果把 foo 改成 mary,seafood 里面没有 mary ,则返回一个 flase。
九.统计个字符串有几个指定的子串: strings.count(" ceheese","e")//4
1、看 ceheese 串中有几个子串 e,有几个就返回几个。查找手册,搜索 count,返回字符串 s 中有几个不重复子串。
2、案例代码:
package main
import (
"fmt"
)
func main()
num := strings.count( "ceheese",“e")
fmt.Printf( "num=%v\n", num)
}
3、输出结果:
num=4
4、代码分析:
返回一个整数用 num 接收,接下来输出 num=%v\n,e 在 ceheese 中有 4 个,所以返回 4。如果把 e 改成 se, 则返回的是 1,如果将 e 改成 seu,则 num 会返回0,因为一个也没有。如果需要查找一篇文章,文章中有几个关键词可以用 cout 解决
十.不区分大小写的字符串比较(==是区分字母大小写的): fmt. Println(strings.EqualFold( "abc")
1、“==”是可以判断字符串是否相等的,但在判断的时候是区分字母大小写的,内容和字母大小都相同才为真,但在比较不想区分字母的大小写,这时可以使用 strings 包中的 EqualFold 函数,这个函数不区分大小写,而==是区分大小写。
2、案例代码:
package main
import (
"fmt"
)
func main()
b = strings.EqualFold("abc", "Abc")
fmt.Printf("b=%vin", b) / /true
fmt.Println(“结果", "abc" == "Abc")
// false //区分字母大小写
}
3、输出结果:
结果 false
4、代码分析:
b = strings.EqualFold("abc", "Abc"),fmt.Printf("b=%vin", b)
这时 b返回真,因为不区分大小写,如果 b=”abc”==”Abc”输出 false,==区分字母大小写。如果在进行密码区分校验的时候,区分大小写接用==,不区分大小写就用 EqualFold。
十一.返回子串在字符串第一次出现的 index 值,如果没有返回-1 ://strings.Index("NLT_abc", "abc")// 4
1、有两个用处,一可以找 abc 子串在 NLT_abc 这个串出现的下标,第二也可以用来判断 NLT_abc 这个串中有没有 abc 子串,如果没有会返回 -1。
2、案例代码:
package main
import (
"fmt"
)
func main()
index :=strings.Index("NLT_abcabcabc","abc")
//4
fmt.Printf( "index=%v\n",index)
}
3、输出结果:
index=4
4、代码解析:
用 index 来接收 index :=strings.Index("NLT_abc","abc")a
是在 NLT_abc这个字符串的第四个下标,所以会返回 4。如果写 hello 在 NLT_abc 中没有出现,因此会返回一个 -1,可以通过是否返回 -1 来决定是否找到。如果 NLT_abcabcabc有 3 个 abc,它找的是第一次出现的,当然也有找最后一次出现的,这时返回也是4。