Skip to main content

String

len

Go语言内置方法,用于获取字符串字节长度。

英文字母(无论大小写)每个字母占1个字节,中文占3个字节。

package main

import "fmt"

func main() {
a := "Hello World"
fmt.Println(len(a)) // 11

b := "这是中文"
fmt.Println(len(b)) // 12
}

由于每个英文字母占1个字节,因此其字节长度与字符个数相等,可通过len直接获取。而在有中文的情况下,由于每个中文占3个字节,因此不能直接通过len获取其字符数,那么有什么办法可以获取到其字符个数呢?

对于字符串来说,其是由一个个字符组成的。在Go语言中,字符存储的本质是存储其对应的编码,因而可将一个个字符看做是一个byterune

因此,可将字符串转成转成每个元素为byterune类型的切片

package main

import "fmt"

func main() {
// [I, \s, l, o, v, e, \s, y, o, u, !]
a := "I love you!"

// 将a字符串转换成每个元素都为byte的类型的切片
aBytes := []byte(a)

// aBytes的每个元素都是ASCII码
fmt.Println(aBytes)
}

但由于byte的范围是0 ~ 255,表示的是ASCII码,而汉字被编排在Unicode码中,因此在存在中文时,需要使用rune类型:

package main

import "fmt"

func main() {
b := "这是中文"

aBytes := []byte(a)
aRunes := []rune(b)

// [232 191 153 230 152 175 228 184 173 230 150 135]
fmt.Println(aBytes)
// [36825 26159 20013 25991]
fmt.Println(aRunes)
// 4
fmt.Println(len(aRunes))
}

转义符

转义

将符号意义转换为普通文本字符的特性。

package main

import "fmt"

func main() {
title := "他说,\"我喜欢《悲惨世界》中的冉阿让\""
title1 := `他说,"我喜欢《悲惨世界》中的冉阿让"`

fmt.Println(title, title1)
}

换行

使用\r\n换行:

package main

import "fmt"

func main() {
title := "I am Jason. \r\nI am at the age of 18."
fmt.Println(title)
/**
I am Jason.
I am at the age of 18.
*/
}

制表符

\t可表示制表符:

package main

import "fmt"

func main() {
fmt.Println("一\t二\t三\t四\t五\t六\t七")
fmt.Println("1\t2\t3\t4\t5\t6\t7")
fmt.Println("8\t9\t10\t11\t12\t12\t14")
fmt.Println("15\t16\t17\t18\t19\t20\t21")
fmt.Println("22\t23\t24\t25\t26\t27\t28")
/**
一 二 三 四 五 六 七
1 2 3 4 5 6 7
8 9 10 11 12 12 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
*/
}

字符串比较

相等与不相等的成立条件是字符串是否顺序与每个字母都相等。

比较大小时,字符串按位置依次进行ASCII码对比。

package main

import "fmt"

func main() {
a := "Hello"
b := "Hello"
c := "hello"


res1 := a == b
res2 := a == c
fmt.Println(res1) // true
fmt.Println(res2) // false

// ASCII码中 h排在H后面
fmt.Println(a > c) // false
fmt.Println(a < c) // true
}

格式化输出

Println

Printlnfmt包下的标准输出方法,其输出行末尾自带回车换行符\r\n

package main

import "fmt"

func main() {
fmt.Println("abc")
fmt.Println("def")
fmt.Print("abc")
fmt.Print("def")

/*
abc
def
abcdef
*/
}

Print

PrintPrintln的区别是末尾不带换行符:

package main

import "fmt"

func main() {
fmt.Print("abc")
fmt.Print("def")

/*
abcdef
*/
}

Printf

格式化输出,可以指定输出格式。

常用的格式有:

  1. %d 输出整型。
  2. %s 输出字符串。
  3. %c 输出字符。
  4. %f 输出浮点型。
  5. %T 输出对应值的类型。
package main

import "fmt"

func main() {
fmt.Printf("My name is %s,My age is %d", "Tom", 18)
// Type is int
fmt.Printf("Type is %T", 18)
}

性能上PrintPrintf更好,如果进行复杂的字符串拼接,Printf损耗较大。

Sprintf

相比于PrintfSprintf会返回格式化后的字符串。

package main

import "fmt"

func main() {
res := fmt.Sprintf("My name is %s,My age is %d", "Tom", 18)
// My name is wxm,My age is 18
fmt.Println(res)
}

strings.Builder

strings是一个字符串方法包,包含了很多字符串相关方法。

strings.Builder.WriteString可用来输出字符串,其性能相当高:

package main

import (
"fmt"
"strings"
)

func main() {
var stringBuilder strings.Builder
stringBuilder.WriteString("My name is ")
stringBuilder.WriteString("Jason")

res := stringBuilder.String()
fmt.Println(res)
}

字符串方法

Containes

检查字符串中是否包含指定的子字符串,包含返回true,否则返回false

package main

import (
"fmt"
"strings"
)

func main() {
title := "我正在学习Go语言,以后会成为一个牛逼的工程师"
res1 := strings.Contains(title, "Go")
res2 := strings.Contains(title, "JavaScript")

// true false
fmt.Println(res1, res2)
}

Count

统计指定的子字符串在字符串中出现的次数,返回int类型:

package main

import (
"fmt"
"strings"
)

func main() {
title := "我正在学习Go语言,以后会成为一个牛逼的工程师,Let's Go"
res := strings.Count(title, "Go")

fmt.Println(res) // 2
}

Split

以指定的分隔符分割字符串组成切片:

package main

import (
"fmt"
"strings"
)

func main() {
strs := "123-456-789"
res := strings.Split(strs, "-")
// [123 456 789]
fmt.Println(res)
}

Index

返回子字符串在字符串中第一次出现的的位置下标,返回int类型:

package main

import (
"fmt"
"strings"
)

func main() {
strs := "This is Golang"
res := strings.Index(strs, "Go")
fmt.Println(res) // 8
}

Replace

替换字符串中的某个子字符串,返回替换后的字符串:

接受四个参数:

  1. 原始字符串。
  2. 待替换字符串。
  3. 新的替换字符串。
  4. 替换次数, -1表示全部(全局)替换。
package main

import (
"fmt"
"strings"
)

func main() {
strs := "Go developer, Go engineer"
res := strings.Replace(strs, "Go", "JavaScript", 1)
fmt.Println(res)
}

Trim

去掉字符串前后指定的字符。

package main

import (
"fmt"
"strings"
)

func main() {
strs := " Go Go Go "
res := strings.Trim(strs, " ")
fmt.Println(strs)
fmt.Println(res)
/*
Go Go Go
Go Go Go
*/
}

大小写转换

  1. ToLower将字符串转成小写。
  2. ToUpper将字符串转成大写。
package main

import (
"fmt"
"strings"
)

func main() {
strs := "JAVASCRIPT"
res := strings.ToLower(strs)
fmt.Println(res) // javascript
}

前后缀

  1. HasPrefix是否有某个前缀字符串。
  2. HasSuffix是否有某个后缀字符串。
package main

import (
"fmt"
"strings"
)

func main() {
strs := "JAVASCRIPT##"
res := strings.HasSuffix(strs, "##")
fmt.Println(res) // true
}