Go 语言入门很简单:String

举报
宇宙之一粟 发表于 2022/02/14 23:16:04 2022/02/14
【摘要】 前言Go 也像 C 语言家族语言一样,使用双引号来声明字符串。Go 字符串可以使用 双引号(" ")或者 反引号(` `)来创建。双引号用来创建可解析的字符串,但不能用来引用多行,这也是大多数字符串的定义方式。反引号用来创建原生的字符串,这些字符串可以由多行组成。多用于多行消息,HTML 以及正则表达式。比如我们这样声明一个字符串:package mainimport "fmt"func m...

前言

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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。