文档章节

Go字符串 && strings包

秋风醉了
 秋风醉了
发布于 2016/08/11 17:24
字数 1163
阅读 29
收藏 0
点赞 0
评论 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=======

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 223
博文 581
码字总数 411013
作品 0
东城
程序员
golang -- 字符串操作

相关包有strings, strconv 判断是否以某字符串打头/结尾 strings.HasPrefix(s string, prefix string) bool => 对应python的str.startswith strings.HasSuffix(s string, suffix string) boo......

flyking ⋅ 2014/01/14 ⋅ 0

Go语言学习笔记 package

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

xumaojun ⋅ 03/12 ⋅ 0

Go基础编程:字符串处理

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

tennysonsky ⋅ 01/16 ⋅ 0

Strings edit 2.8 发布,Ada 工具包库

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

红薯 ⋅ 2012/04/05 ⋅ 0

Go基础编程:正则表达式

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

tennysonsky ⋅ 01/17 ⋅ 0

guava 实用操作集合

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

Atom_me ⋅ 2016/01/01 ⋅ 1

postgresql jdbc 了解postgresql数据库对jdbc的参数设置

postgresql jdbc 连接到postgresql 数据库时,postgresql数据库会返回一些参数来设置jdbc。postgresql 是通过发送类型为S的数据包给客户端的。本文主要讲解jdbc中针对哪些参数进行了使用。 ...

harris2016 ⋅ 2016/06/15 ⋅ 0

golang中strings包用法

package main import ("fmt""strings"//"unicode/utf8") func main() {fmt.Println("查找子串是否在指定的字符串中")fmt.Println(" Contains 函数的用法")fmt.Println(strings.Contains("sea......

ethantonylam ⋅ 2016/05/25 ⋅ 0

有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置

版权声明:本文为博主原创文章,未经博主允许不得转载。 /** * 功能:有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置。 / [java] view plain copy /* * 思路:对二分...

一贱书生 ⋅ 2016/11/24 ⋅ 0

通过libzdb连接数据库

一.引用博客一些用法介绍: Libzdb挺强大, 支持MySQL Oracle SQLite PostgreSQL,支持C和C++ Object C,不能在Window下用(看源码是因为基于Linux线程机制编写实现)。 遗憾的是找个资料太费...

Splace ⋅ 2016/06/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 33分钟前 ⋅ 2

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部