文档章节

Go字符串 && strings包

秋风醉了
 秋风醉了
发布于 2016/08/11 17:24
字数 1163
阅读 55
收藏 0

Go字符串 && strings包

在Go中string底层是用byte数组存的,并且是不可以改变的。

单行字符串和多行字符串

如下代码所示,

package main

import "fmt"

func main() {
	var str string = "hello world";

	//多行字符串中不可以使用转移字符
	var msg string = `hello
		world!
	what's wrong with you?`

	fmt.Println(str)
	fmt.Println(msg) //按照原格式打印出来

	var format string = "hello %s \n"  //单行字符串中可以使用转移字符
	fmt.Printf(format, "world")
}

字符串的编码格式

Go 语言中的字符串是以 UTF-8 格式编码并存储的,例如:

s := "Hello 世界!"

变量 s 中存放的是这个字符串的 UTF-8 编码,当你使用 len(s) 函数获取字符串的长度时,获取的是该字符串的 UTF-8 编码长度。通常我们认为,在电脑中存储一个 ASCII 字符需要一个字节,存储一个非 ASCII 字符需要两个字节,这种认为仅仅是针对 Windows 系统中常用的 ANSI 编码而言的,而在 Go 语言中,使用的是 UTF-8 编码,用 UTF-8 编码来存放一个 ASCII 字符依然只需要一个字节,而存放一个非 ASCII 字符,则需要 2个、3个、4个字节,它是不固定的。

既然 Go 中的字符串存放的是 UTF-8 编码,那么我们使用 s[0] 这样的下标方式获取到的内容就是 UTF-8 编码中的一个字节。对于非 ASCII 字符而言,这样的一个字节没有实际的意义,除非你想编码或解码 UTF-8 字节流。而在 Go 语言中,已经有很多现成的方法来编码或解码 UTF-8 字节流了。

遍历字符串中的字节(使用下标访问):

s := "Hello 世界!"                    //字符串底层使用byte数组存储
for i, l := 0, len(s); i < l; i++ { //len(s) 返回子节数组的长度
	// %2v 相应值的默认格式
	fmt.Printf("%2v = %v\n", i, s[i]) //输出单个字节值
}

遍历字符串中的字符(使用 for range 语句访问):

s := "Hello 世界!"
for i, v := range s {
	// i 是字符的字节位置,v 是字符的拷贝
	fmt.Printf("%2v = %c\n", i, v) // 输出单个字符
}

在 Go 语言中,字符串的内容是不能修改的,也就是说,你不能用 s[0] 这种方式修改字符串中的 UTF-8 编码,如果你一定要修改,那么你可以将字符串的内容复制到一个可写的缓冲区中,然后再进行修改。这样的缓冲区一般是 []byte 或 []rune。如果要对字符串中的字节进行修改,则转换为 []byte 格式,如果要对字符串中的字符进行修改,则转换为 []rune 格式,转换过程会自动复制数据。

修改字符串中的字节(用 []byte):

s := "Hello 世界!"
b := []byte(s)        // 转换为 []byte,自动复制数据
b[5] = ','            // 修改 []byte
fmt.Printf("%s\n", s) // s 不能被修改,内容保持不变
fmt.Printf("%s\n", b) // 修改后的数据

修改字符串中的字符(用 []rune):

s := "Hello 世界!"
r := []rune(s)         // 转换为 []rune,自动复制数据
r[6] = '中'            // 修改 []rune
r[7] = '国'            // 修改 []rune
fmt.Println(s)         // s 不能被修改,内容保持不变
fmt.Println(string(r)) // 转换为字符串,又一次复制数据

在 []byte 中处理 rune 字符(需要用到 utf8 包中的解码函数)

b := []byte("Hello 世界!")
for len(b) > 0 {
	r, n := utf8.DecodeRune(b) // 解码 b 中的第一个字符
	fmt.Printf("%c\n", r)      // 显示读出的字符
	b = b[n:]                  // 丢弃已读取的字符
}

strings包的字符串处理函数

分割字符串

package main

import (
	"fmt"
	"strings"
)

func main() {
	var str string = "hello world     good   luck"
	//这个函数的作用是按照1:n个空格来分割字符串最后返回的是[]string的切片
	fmt.Println(strings.Fields(str))

	split := func(s rune) bool {
		if s == 'o' {
			return true
		}
		return false
	}

	var str2 = "helloworld"
	//根据自定义函数来分割字符串
	fmt.Println(strings.FieldsFunc(str2, split))//[hell w rld]

	var str3 string = "a,b,c,d,e"
	//根据分隔符来分割字符串
	fmt.Println(strings.Split(str3, ",")) //[a b c d e]

	var str4 string = "Users,xinxingegeya,gogogo"

	//[Users,xinxingegeya,gogogo]
	//[Users xinxingegeya,gogogo]
	//[Users xinxingegeya gogogo]
	//[Users xinxingegeya gogogo]
	fmt.Println(strings.SplitN(str4, ",", 1))
	fmt.Println(strings.SplitN(str4, ",", 2))
	fmt.Println(strings.SplitN(str4, ",", 3))
	fmt.Println(strings.SplitN(str4, ",", 4))
}

包含字符串

package main

import (
	"fmt"
	"strings"
)

func main() {
	var str string = "hello 世界!!!"

	fmt.Println(strings.Contains(str, "世界")) //true

	fmt.Println(strings.Contains(str, "he")) //true

	fmt.Println(strings.Contains(strings.ToLower(str), strings.ToLower("HE")))

	fmt.Println(strings.Index(str, "ll")) //返回子字符串第一个字符的索引位置
}

其它操作方式

https://github.com/astaxie/gopkg/tree/master/strings

参考引用:

http://www.cnblogs.com/golove/p/3284304.html

http://www.cnblogs.com/howDo/archive/2013/04/20/GoLang-String.html

=======END=======

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 239
博文 572
码字总数 416654
作品 0
朝阳
程序员
私信 提问
Go语言学习笔记 package

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 strings strings包实现了用于操作字符的简单函数。 strings.Index("suoning", "n") //3(子串第一次出现的位置,不存在则返回...

xumaojun
03/12
0
0
Go基础编程:字符串处理

本文转自:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/07.6.md 字符串在开发中经常用到,包括用户的输入,数据库读取的数据等,我们经常需要对字符串进行...

tennysonsky
01/16
0
0
Strings edit 2.8 发布,Ada 工具包库

Strings edit 是一个 Ada 语言的工具包库,提供常用的 IO操作、整数、浮点数以及罗马数字的处理。 Strings edit 2.8 改进了 Strings_Edit.Lexicographical_Order 包提供了字符串包含数字的比...

红薯
2012/04/05
522
0
Go基础编程:正则表达式

正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活。按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几...

tennysonsky
01/17
0
0
guava 实用操作集合

guava是 google 几个java核心类库的集合,包括集合、缓存、原生类型、并发、常用注解、基本字符串操作和I/O等等。 大家平时经常遇到某些相同的问题,自己写代码也都能解决。但是久而久之会感觉...

Atom_me
2016/01/01
204
1

没有更多内容

加载失败,请刷新页面

加载更多

spring学习笔记(二)spring 事件的使用

spring 中的事件 spring事件通过订阅发布 可以解耦操作 可以同步 可以异步 步骤 编写事件 通过继承org.springframework.context.ApplicationEvent 来编写事件 public ApplicationEvent(Obj...

NotFound403
12分钟前
1
0
特斯拉车主成功破解了自己Model 3汽车

据汽车博客Electrek消息,一位特斯拉车主成功破解了自己Model 3汽车,还在此基础上运行了Ubuntu。 这位叫trsohmers的网友表示,“功劳大多要归到Ingineerix的头上,他花了数月才找到初始的那...

linuxCool
26分钟前
1
0
Gitbook : random errors when using gitbook plugin on running "gitbook serve"

在执行gitbook serve时,会有不定的失败错误 参考问题 :#1309 解决方案: 更新gitbook版本,这个问题似乎是3版本的问题 , 官方也不打算在这个版本解决了。 更新 到最新版本后, 不再出现问...

ol_O_O_lo
40分钟前
1
0
提灯照暗,向内自省——《中国文化的深层结构》读书笔记3800字

提灯照暗,向内自省——《中国文化的深层结构》读书笔记3800字: 作者:王健茜;断断续续一个多月才读完了《中国文化的深层结构》,这并不是一本难懂的书,之所以读得慢,源于对书中观点的思...

原创小博客
43分钟前
1
0
高德地图-行政区域接口

1、获取全国各省信息 https://restapi.amap.com/v3/config/district?extensions=all&key=应用Key&s=rsv3&output=json 2、获取下级行政区域信息 https://restapi.amap.com/v3/config/distric......

voole
54分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部