Go 字符串函数详解(1) | 学习笔记

简介: 快速学习 Go 字符串函数详解(1)

开发者学堂课程【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”直接输出这个长度 fmt.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、结果输出为

image.png

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。

相关文章
|
3月前
|
监控 安全 Java
Go语言学习笔记(一)
Go语言学习笔记(一)
106 1
|
2月前
|
存储 分布式计算 算法
GO学习笔记之表达式
GO学习笔记之表达式
33 1
|
2月前
|
存储 编译器 Go
GO语言学习笔记
GO语言学习笔记
23 1
|
7月前
|
自然语言处理 前端开发 Java
Go 学习笔记-Go 编译器简介
Go 学习笔记-Go 编译器简介
43 0
|
7月前
|
自然语言处理 算法 Java
Go学习笔记-Go编译器简介
Go学习笔记-Go编译器简介
51 0
|
7月前
|
存储 Go
Go学习笔记-Go 浮点数设计原理
Go学习笔记-Go 浮点数设计原理
57 0
|
7月前
|
Go 自然语言处理 编译器
Go 学习笔记-Go 词法解析
Go 学习笔记-Go 词法解析
50 0
Go 学习笔记-Go 词法解析
|
7月前
|
Go iOS开发 MacOS
Go学习笔记-代码调试工具 dlv
Go学习笔记-代码调试工具 dlv
196 1
Go学习笔记-代码调试工具 dlv
|
7月前
|
编译器 Go
Go学习笔记-defer、panic、recover分析
Go学习笔记-defer、panic、recover分析
43 1
Go学习笔记-defer、panic、recover分析
|
7月前
|
存储 安全 Linux
Go语言学习笔记-进程和线程
Go语言学习笔记-进程和线程
36 0
Go语言学习笔记-进程和线程