二、字符串相关

字符串赋值

字符串的赋值,使用""可以添加\n,\t这些字符,使用反引号将代表原生的字符。

1
2
3
4
5
6
7
8
9
package main
import "fmt"

func main() {
myName := "我的名字是\nzhangsan"
myName1 := `我的名字是\nzhangsan`

fmt.Println(myName,myName1)
}

运行结果:

1
2
我的名字是
zhangsan 我的名字是\nzhangsan

字符串的拼接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main
import (
"fmt"
)

func main() {
world := "我的名字是:"
myName := "zhangsan"
msg := "name"
msg += "---zhangsan" // 类似 msg = msg + ”---zhangsan“

fmt.Println(world + myName) // 通过+号对字符串进行拼接
fmt.Println(msg)
fmt.Printf("我的名字是:%s",myName) // 通过Printf添加占位符打印信息
}

/* 运行结果
我的名字是:zhangsan
name---zhangsan
我的名字是:zhangsan
*/

函数:func Repeat(s string, count int) string
说明:将 count 个字符串 s 连接成一个新的字符串
示例:

1
2
s := "Good!"
fmt.Println(strings.Repeat(s, 3)) // "Good!Good!Good!"

函数:func Join(a []string, sep string) string
说明:Join 将 a 中的子串连接成一个单独的字符串,子串之间用 sep 分隔
示例:

1
2
s := []string{"foo", "baa", "bae"}
fmt.Println(strings.Join(s, ", ")) // 返回字符串:foo, baa, bae

字符串索引、分割与切片

1
2
3
4
5
6
func main() {
msg := "abcdefghi"
fmt.Printf("%T %#v %c\n",msg[0],msg[0],msg[0]) // uint8 0x61 a,字符串索引
fmt.Println(msg[1:3]) // bc,切片字符串
fmt.Println(len(msg)) // 9,求字节的长度
}

函数: Fields(s string) []string
说明: 将字符串 str以空格、tab、回车、换行、换页这些空白符为分隔符拆分成若干个字符串,若成功则返回分割后的字符串切片
示例:

1
2
3
4
5
6
7
8
9
10
str := "Hello World"
for _, v := range strings.Fields(str) {
fmt.Println(v)
}
//程序输出 “Hello” 和 "World"


// 将字符串按指定字符"-"进行分割
fmt.Printf("%s",strings.Split("a-b-c","-")) // [a b c]
fmt.Printf("%s",strings.SplitN("aa-aa-aa","-",2)) // [aa aa-aa]

字符串的遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main() {
msg := "abcdefghi"
msg2 := "我热爱go语言"

// 遍历字符串中的字符
for i:= 0; i< len(msg); i++{
fmt.Printf("%c\n",msg[i])
}

// 遍历字符串中的汉字
for _,v :=range msg2{
fmt.Printf("%q",v)
}
}

字符串类型转换

其他类型转成字符串类型

strconv.FormatXXX()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func main() {
// 字符串转换成字符切片
slice := []byte("hello") // 强制类型转换 string-->[]byte
fmt.Println(slice) // [104 101 108 108 111]

// 字符切片转换成字符串
slice2 := []byte{'h', 'e', 'l', 'l', 'o', 97}

// 强制类型转换 []byte-->string
fmt.Println(string(slice2)) // helloa

// bool转换成string
str1 := strconv.FormatBool(true)
fmt.Println(str1) // true

// int转换成string 10表示十进制
fmt.Println(strconv.FormatInt(123, 10)) // 123

// 十进制int转换成string
fmt.Println(strconv.Itoa(123)) // 123

// 3.140000 float转换成string 6:保留6位 64:float64
fmt.Println(strconv.FormatFloat(3.14, 'f', 6, 64))
}

字符串类型转成其他类型

strconv.ParseXXX()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func main() {
// 字符串转换成Bool类型
b, err_info := strconv.ParseBool("false")
if err_info != nil { // 如果有错误信息
fmt.Println("类型转换出错")
} else {
fmt.Println(b) // false
}


intVal := 65
float64Val := 2.2
stringVal := "4"

// 字符串转换成int
v, err := strconv.Atoi(stringVal)
fmt.Println(err, v) // 4

//将字符串转换成float64
vv, err := strconv.ParseFloat("3.1415",64)
fmt.Println(err,vv) // 3.1415
}

字符串切片和字符切片互转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func main() {
ascii := "abc我爱Go"
// 将字符串转换成字节切片
fmt.Println([]byte(ascii))
// 将字符串转换成unicode 码点
fmt.Println([]rune(ascii))

// 取字符串长度
// 当字符串中包含中文取字符串长度时用len([]byte(ascii))不会准确,每个英文算1个字符,中文算3个字符
fmt.Println(len([]byte(ascii))) // 11

// 使用len([]rune(ascii))统计带中文的字符串会更准确
fmt.Println(len([]rune(ascii))) // 7

// 将[]byte和[]rune转换成字符串
fmt.Println(string([]byte(ascii))) // abc我爱Go
fmt.Println(string([]rune(ascii))) // abc我爱Go
}

其他数据类型转换

1
2
3
4
5
6
7
8
9
10
11
12
func main() {
// 二进制转换成int64类型
val, err_info := strconv.ParseInt("11011001", 2, 64) // 2:二进制 64:int64
fmt.Println(val) // 217

intVal := 65
float64Val := 2.2
stringVal := "4"

// 将float64转换成10进制位
fmt.Println(strconv.FormatFloat(float64Val,'f',10,64)) // 2.2000000000
}

字符串的查找替换与判断(strings包)

函数:Contain(s,str string) bool
说明:查找子串是否在指定的字符串中
示例:

1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.Contains("TigerwolfC", "wolf")) //true
fmt.Println(strings.Contains("TigerwolfC", "bar")) //false
fmt.Println(strings.Contains("TigerwolfC", "")) //true
fmt.Println(strings.Contains("", "")) //true 这里要特别注意
fmt.Println(strings.Contains("我是中国人", "我")) //true
}

函数: ContainsAny(s, chars string) bool
说明: 判断字符串 s 中是否包含 chars 中的任何一个字符,如果有返回 true,否则返回false
示例:

1
2
3
4
5
str := "Hello World"
fmt.Println(strings.ContainsAny(str, "W")) // true
fmt.Println(strings.ContainsAny("foo", "")) // false
fmt.Println(strings.ContainsAny(str, "def")) // true
fmt.Println(strings.ContainsAny("", "")) // false

函数: Count(s, sep string) int
说明: 判断字符 sep 在字符串 s 总共出现的次数,如果不存在返回0
示例:

1
2
3
4
5
6
str := "Hello World"
fmt.Println(strings.Count(str, "e")) //程序输出 1
str1 := "Hello Weed"
fmt.Println(strings.Count(str1, "e")) //程序输出 3
str2 := "Hello World"
fmt.Println(strings.Count(str2, "p")) //程序输出 0

函数: EqualFold(s, t string) bool
说明: 判断字符串 s 是否与字符串 t 相等,并且不区分大小写
示例:

1
2
str := "Hello World"
fmt.Println(strings.EqualFold(str, "hello world")) //程序输出 true

函数: HasPrefix(s, prefix string) bool
说明: 判断字符串 s 是否是以字符 prefix 开头,如果是返回 true 否则返回 false
示例:

1
2
str := "Hello World"
fmt.Println(strings.HasPrefix(str, "He")) //程序输出 true

函数: HasSuffix(s, suffix string) bool
说明: 判断字符串 s 是否是以字符 suffix 结尾,如果是返回 true 否则返回 false
示例:

1
2
str := "Hello World"
fmt.Println(strings.HasSuffix("str ", "orld")) //程序输出 true

函数: Index(s, sep string) int
说明: 判断字符 sep 在字符串 s 中第一次出现的位置,如果成功则返回sep位置的索引,如果字符 sep 不在字符串 s 中则返回 -1
示例:

1
2
3
str := "Hello World"
fmt.Println(strings.Index(str, "e")) //程序输出 1
fmt.Println(strings.Index(str, "c")) //程序输出 -1

函数: func LastIndex(s, sep string) int
说明:返回子串 sep 在字符串 s 中最后一次出现的位置,如果找不到,则返回 -1,如果 sep 为空,则返回字符串的长度
示例:

1
2
3
4
str := "Hello World"
fmt.Println(strings.LastIndex(str, "h")) //程序输出 -1
fmt.Println(strings.LastIndex(str, "o")) //程序输出 7
fmt.Println(strings.LastIndex(str, "")) //程序输出 11

函数:func IndexAny(s, chars string) int
说明:返回字符串 chars 中的任何一个字符在字符串 s 中第一次出现的位置, 如果找不到,则返回 -1,如果 chars 为空,则返回 -1
示例:

1
2
3
4
str := "Hello World"
fmt.Println(strings.IndexAny(str, "abc")) //程序输出 -1
fmt.Println(strings.IndexAny(str, "dof")) //程序输出 4
fmt.Println(strings.IndexAny(str, "")) //程序输出 -1

函数:func ToUpper(s string) string
说明:将 s 中的所有字符修改为其大写格式,对于非 ASCII 字符,它的大写格式需要查表转换
函数:func ToLower(s string) string
说明:将 s 中的所有字符修改为其小写格式,对于非 ASCII 字符,它的小写格式需要查表转换
函数:func ToTitle(s string) string
说明:ToTitle 将 s 中的所有字符修改为其 Title 格式,大部分字符的 Title 格式就是其 Upper 格式,只有少数字符的 Title 格式是特殊字符, 这里的 ToTitle 主要给 Title 函数调用

示例:

1
2
3
4
s := "heLLo worLd Abc"
fmt.Println(us := strings.ToUpper(s)) // "HELLO WORLD ABC"
fmt.Println(strings.ToLower(s)) // "hello world abc"
fmt.Println(strings.ToTitle(s)) // "HELLO WORLD ABC"

函数:func Trim(s string, cutset string) string
说明:将删除 s 首尾连续的包含在 cutset 中的字符
函数:func TrimLeft(s string, cutset string) string
说明:TrimLeft 将删除 s 头部连续的包含在 cutset 中的字符
函数:func TrimRight(s string, cutset string) string
说明:TrimRight 将删除 s 尾部连续的包含在 cutset 中的字符
示例:

1
2
3
4
5
6
7
8
9
10
s := " Hello 世界! "
ts := strings.Trim(s, " Helo!")
fmt.Printf("%q\n", ts) // "世界"
fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! ")) // ["Achtung"]

tr := strings.TrimLeft(s, " Helo")
fmt.Printf("%q\n", tr) // "世界! "

tx := strings.TrimRight(s, " 世界!")
fmt.Printf("%q\n", tx) // " Hello"

函数:func TrimPrefix(s, prefix string) string
说明:TrimPrefix 删除 s 头部的 prefix 字符串,如果 s 不是以 prefix 开头,则返回原始 s
示例:

1
2
3
4
5
s := "@Hello@世界!"
ts := strings.TrimPrefix(s, "@")
fmt.Printf("%q\n", ts) // " Hello@世界!"
tx:= strings.TrimPrefix(s, "$")
fmt.Printf("%q\n", tx) // " @Hello@世界!"

函数:func TrimSuffix(s, suffix string) string
说明:TrimSuffix 删除 s 尾部的 suffix 字符串,如果 s 不是以 suffix 结尾,则返回原始 s
示例:

1
2
3
s := "Hello 世界!!!!!"
ts := strings.TrimSuffix(s, "!!!!")
fmt.Printf("%q\n", ts) // "Hello 世界!"

函数:func Replace(s, old, new string, n int) string
说明:Replace 返回 s 的副本,并将副本中的 old 字符串替换为 new 字符串替换次数为 n 次,如果 n 为 -1,则全部替换,如果 old 为空,则在副本的每个字符之间都插入一个 new
示例:

1
2
fmt.Println(strings.Replace("ABAACEDF", "A", "a", 2)) // aBaACEDF
fmt.Println(strings.Replace("ABAACEDF", "A", "a", -1)) // aBaaCEDF

trings.TrimSpace 剔除字符串中的空白字符

1
2
// 剔除字符串中的\n\t\f等的空白字符
fmt.Println(strings.TrimSpace("\n\f\tabcdefg")) // abcdefg

strings.Title 将字符串中单词首字符大写

1
2
// 将索引字符首字母大写
fmt.Println(strings.Title("my name is xiao pu")) // My Name Is Xiao Pu