写点什么

Go 语言入门很简单:String

作者:宇宙之一粟
  • 2022 年 2 月 12 日
  • 本文字数:2093 字

    阅读完需:约 7 分钟

前言

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 语言提供字符串对加号 “+” 的支持,使用“ + ”操作符将两个字符串拼接起来:


str1 := "Hello "str2 := "world"str3 := str1 + str2fmt.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"表示离开它以确定类型。


这些序列允许我们在不强制转换的情况下将数字和其他类型添加到字符串中。



这些函数类似于 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----52.8769---- demo numeric to string ----85.872000
复制代码


发布于: 刚刚阅读数: 2
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020.05.07 加入

🏆InfoQ写作平台-第二季签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于软件工程师,弹性不加班 热衷分享,执着于阅读写作,佛系不水文

评论

发布
暂无评论
Go 语言入门很简单:String