为了账号安全,请及时绑定邮箱和手机立即绑定

Go 快速入门指南 - 字符串

标签:
Go

概述

Go 中 字符串 语义和其他编程语言中的字符串中一样,有一点不同的地方在于: Go 中字符串值无法改变,可以理解为:一旦完成定义之后,字符串就是一个 常量。

解释型字符串

使用双引号 " 括起来,其中的转义符将被替换,转义符包括:

  • \n: 换行符

  • \r: 回车符

  • \t: tab 键

  • \u: 或 \U:Unicode 字符

  • \\: 反斜杠自身

  • • 其他转义符

示例

package main

func main() {
    s := "hello\nworld"
    println(s)
}
// $ go run main.go
// 输出如下
/**
    hello
    world
*/

非解释型字符串

使用反引号 ` 括起来,其中的转义符会被原样输出。

示例

package main

func main() {
    s := `hello world \n`
    println(s)
}
// $ go run main.go
// 输出如下
/**
    hello world \n
*/

字符串不可变的语义

字符串的 不可变 是指: 字符串定义之后,每个索引位置的字符不可被修改,如下所示:

package main

func main() {
    s := "hello world"
    s[0] = 'a'
    s[1] = 'b'
}
// $ go run main.go
// 输出如下
/**
    ./main.go:5:2: cannot assign to s[0] (value of type byte)
    ./main.go:6:2: cannot assign to s[1] (value of type byte)
*/

但是,可以通过为字符串重新赋值,改变原有字符串,如下所示:

package main

func main() {
    s := "hello world"
    s = "hello golang"
    println(s)
}
// $ go run main.go
// 输出如下
/**
    hello golang
*/

字符串长度

关于字符串不同编码对长度的计算方式,感兴趣的读者可以参考扩展阅读。

ASCII

package main

func main() {
    s := "hello world"
    println(len(s))
}
// $ go run main.go
// 输出如下
/**
    11
*/

中文算作 3 个字符

中文会按照 3 个字节计算,这在一些场景下 (统计时英文和中文都算一个字),可能并不适合。

package main

func main() {
    s := "hello 世界"
    println(len(s))
}
// $ go run main.go
// 输出如下
/**
    12
*/

中文算作 1 个字符

package main

import "unicode/utf8"

func main() {
    s := "hello world"
    println(utf8.RuneCountInString(s))

    s2 := "hello 世界"
    println(utf8.RuneCountInString(s2)) // 每个中文文字算作一个字符
}
// $ go run main.go
// 输出如下
/**
    11
    8
*/

子字符串

语法规则

s[i:j]

s 代表字符串变量名称, i 和 j 的取值范围是 0 到 len(s) (字符串长度)。如果两个参数都不设置,则取全部字符。

例子

package main

import "fmt"

func main() {
    s := "hello world"

    s2 := s[3:5] // 取第 3 个到第 5 个字符
    fmt.Printf("s2 = %v, type = %T\n", s2, s2)

    s3 := s[:] // 取全部字符
    fmt.Printf("s3 = %v, type = %T\n", s3, s3)
}
// $ go run main.go
// 输出如下
/**
    s2 = lo, type = string
    s3 = hello world, type = string
*/

字符串遍历

为了处理不同编码字符串,请使用 range

例子

注意区分不同编码对遍历结果的影响。

package main

import "fmt"

func main() {
    str := "hello 世界"

    // ASCII 编码方式遍历
    for i := 0; i < len(str); i++ {
        fmt.Printf("%c  ", str[i])
    }
    fmt.Println()

    // Unicode 编码方式遍历
    for _, s := range str {
        fmt.Printf("%c  ", s)
    }
    fmt.Println()
}
// $ go run main.go
// 输出如下
/**
    h  e  l  l  o     ä  ¸     ç      
    h  e  l  l  o     世  界
*/

字符串拼接

使用 +

package main

func main() {
    s := "hello world"
    s += " !"
    println(s)
}
// $ go run main.go
// 输出如下
/**
    hello world !
*/

使用 fmt.Sprintf() 函数

package main

import "fmt"

func main() {
    s := "hello world"
    s2 := fmt.Sprintf("%s %s", s, " !")
    println(s2)
}
// $ go run main.go
// 输出如下
/**
    hello world !
*/

扩展阅读

    1. 十分钟搞清字符集和字符编码 (http://cenalulu.github.io/linux/character-encoding)
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
0
获赞与收藏
0

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消