前言
Go 也像 C 语言家族语言一样,使用双引号来声明字符串。
Go 字符串可以使用 双引号(" ")或者 反引号(\ \
)来创建。双引号用来创建可解析的字符串,但不能用来引用多行,这也是大多数字符串的定义方式。
反引号用来创建原生的字符串,这些字符串可以由多行组成。多用于多行消息,HTML 以及正则表达式。
比如我们这样声明一个字符串:
package main
import "fmt"
func main() {
hello_Chinese := "您好"
hello_English := "Hello"
hello_Japanese := "こんにちは"
hello_French := "Bonjour"
fmt.Println(hello_Chinese)
fmt.Println(hello_English)
fmt.Println(hello_Japanese)
fmt.Println(hello_French)
longString := `
Hello, my friend!
.This is a long string`
fmt.Println(longString)
}
运行以上代码, 我们可以看到 Go 也能支持非英文字符,比如 “您好”、“こんにちは”:
$ go run hello.go
您好
Hello
こんにちは
Bonjour
Hello, my friend!
.This is a long string
字符串拼接
开发过程中难免会出现一些字符串追加或者拼接的功能,Go 语言提供字符串对加号 “
- 程中难免会出现一些字符串追加或者拼接的功能,Go 语言提供字符串对加号 “+” 的支持,使用“ + ”操作符将两个字符串拼接起来:
str1 := "Hello "
str2 := "world"
str3 := str1 + str2
fmt.Println(str3) // Hello world
如果想要创建一个长的可解析字符串变量,但又不想在代码中写同意长的一行,也可以使用“
- 要创建一个长的可解析字符串变量,但又不想在代码中写同意长的一行,也可以使用“ + ”拼接符将这些片段连接起来。
需要注意的是,Go 语言的字符串是不可变的,但它们支持“ += ”追加操作符。这种字符串连接的方法很容易阅读,非常适合简单的情况。 但是,虽然 Go 确实允许我们使用 +(或 +=)运算符连接字符串,但它并不是最有效的方法。 最好仅在添加很少的字符串时使用,而不是在热代码路径中。
text := "the very things that in the moment dampen our moods " +
"can later be sources of intense gratification"
text += " and delight."
fmt.Println(text)
在大部分情况下,内置的 fmt.Sprintf
函数是一个更好的选择构建一个字符串。
str4 := fmt.Sprintf("%s %s", str1, str2)
fmt.Println(str4) // Hello world
注意:“+” 号不支持不同类型的变量相加和拼接。
使用fmt包来格式化字符串
"%s" 序列是一个特殊的占位符,它告诉 Sprintf 函数在该位置插入字符串。还有其他不是字符串的序列,比如:
- "%d" 表示整数
- "%f" 表示浮点数
- 或"%v"表示离开它以确定类型。
这些序列允许我们在不强制转换的情况下将数字和其他类型添加到字符串中。
语法 | 含义 |
fmt.Errorf(format, args…) | 返回一个包含所给定的格式化字符串以及args参数的错误值 |
fmt.Fprint(writer, args…) | 按照格式%v和空格分隔的非字符串将args写入writer中,返回写入的字节数和一个值为error或者nil的错误值 |
fmt.Fprintf(writer, format, args…) | 按照字符串格式format将args参数写入writer,返回写入的字节数和一个值为error或者nil的错误值 |
fmt.Fprintln(writer, args…) | 按照格式%v以空格分隔的非字符串将args写入writer,返回写入的字节数和一个值为error或者nil的错误值 |
fmt.Print(format, args…) | 按照格式%v以空格分隔的非字符串将args写入os.Stdout,返回写入的字节数和一个值为error或者nil的错误值 |
fmt.Printf(format, arg…) | 使用格式化字符串format将args写入os.Stdout,返回写入的字节数和一个值为error或者nil的错误值 |
fmt.Println(format, arg…) | 按照格式%v以空格分隔以换行符结尾将参数args写入os.Stdout,返回写入的字节数和一个值为error或者nil的错误值 |
fmt.Sprint(args…) | 返回args参数组成的字符串,每个参数都使用%v进行格式化的使用空格分离的非字符串 |
fmt.Sprintf(format,args…) | 返回使用格式format格式化的args字符串 |
fmt.Sprintln(args) | 返回使用格式%v格式化args后的字符串,以空格分隔以换行符结尾 |
这些函数类似于 C 中 printf 和 scanf 函数中的代码,以及 Python 中的旧式字符串格式化。
读者有兴趣可以自己去体验上述函数。
拆分字符串
string 包只需添加导入块中加入 import "strings"
,这个包为我们提供了许多字符串操作功能。其中之一是用分隔符拆分字符串并获得一段字符串的函数:
package main
import (
"fmt"
"strings"
)
func main() {
myClass := "小张,小李,小王,大周"
name := strings.Split(myClass, ",")
fmt.Printf("%q", name) // ["小张" "小李" "小王" "大周"]
}
string.Split
函数以字符串和分隔符作为参数。
在本例中,我们传入"小张,小李,小王,大周"
和分隔符 ","
,并收到一个字符串片段: ["小张" "小李" "小王" "大周"]
.
计数和查找子字符串
使用 strings 包,我们还可以计算一个字符串中的子字符串的非重叠实例的数量,该函数是strings.Count
。
看一下如下的代码:
package main
import (
"fmt"
"strings"
)
func main() {
test := "January February"
count1 := strings.Count(test, "r")
count2 := strings.Count(test, "uary")
fmt.Println(count1, count2) // 3 2
}
strconv 包
strconv 包提供了字符串和其他类型的数据之间进行转换的函数:
strconv.ParseInt(s, base, bits)
: 如果 s 能够转换成一个整数,则返回 int64 值和 nil ,否则返回 0 和 error ;如果 base 为 0 ,则表示要从 s 中判断进制的大小。
package main
import (
"fmt"
"strconv"
)
func main() {
// 字符串转换我数字类型
fmt.Println("---- demo String To Numeric----")
str1_val1 := "5"
str2_val2 := "2.8769"
var err error
var int_val1 int64
int_val1, err = strconv.ParseInt(str1_val1, 10, 32) // base10, 64 size
if err == nil {
fmt.Println(int_val1)
} else {
fmt.Println(err)
}
var float_val2 float64
float_val2, err = strconv.ParseFloat(str2_val2, 64) // 64 size
if err == nil {
fmt.Println(float_val2)
} else {
fmt.Println(err)
}
// 数字类型转字符串
fmt.Println("---- demo numeric to string ----")
num1 := 8
num2 := 5.872
var str_num1 string
str_num1 = fmt.Sprintf("%d", num1)
fmt.Println(str_num1)
var str_num2 string
str_num2 = fmt.Sprintf("%f", num2)
fmt.Println(str_num2)
}
运行上述代码,结果为:
---- demo String To Numeric----
5
2.8769
---- demo numeric to string ----
8
5.872000