Go 语言入门很简单:String

简介: Go 也像 C 语言家族语言一样,使用双引号来声明字符串。Go 字符串可以使用 双引号(" ")或者 反引号(` `)来创建。双引号用来创建可解析的字符串,但不能用来引用多行,这也是大多数字符串的定义方式。反引号用来创建原生的字符串,这些字符串可以由多行组成。多用于多行消息,HTML 以及正则表达式。

前言

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 + 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"表示离开它以确定类型。


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



这些函数类似于 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
相关文章
|
17天前
|
Go
go语言中的数据类型
go语言中的数据类型
13 0
|
23天前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
23天前
|
安全 Go
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
|
4天前
|
数据采集 存储 Go
使用Go语言和chromedp库下载Instagram图片:简易指南
Go语言爬虫示例使用chromedp库下载Instagram图片,关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务,如导航至用户页面、截图并存储图片。代码中新增`analyzeAndStoreImage`函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
使用Go语言和chromedp库下载Instagram图片:简易指南
|
23天前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
|
1天前
|
存储 NoSQL 安全
Redis入门到通关之Redis数据结构-String篇
Redis入门到通关之Redis数据结构-String篇
|
1天前
|
存储 缓存 NoSQL
Redis入门到通关之String命令
Redis入门到通关之String命令
|
1天前
|
人工智能 Go 调度
掌握Go并发:Go语言并发编程深度解析
掌握Go并发:Go语言并发编程深度解析
|
1天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
|
2天前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
11 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解