Go语言中的字符串

Go 中的字符串是兼容 Unicode 编码的,并且使用 UTF-8 进行编码,这样每一个Unicode字符根据代码点的大小使用1、2、3或4个字节表示代码点。
Go 语言中的字符串是一个字节切片,也就是说单个字符可以被字节索引,我们可以假定每个字符的编码只会占用一个字节。例如:

var s = "Hello world!"
for i:= 0; i < len(s); i++ {
fmt.Printf("%x ", s[i])//48 65 6c 6c 6f 20 77 6f 72 6c 64 21
}

如果是ASCII字符(用一个单一的UTF-8字节表示)(一个字节),这样做没有什么问题,若是非ASCII字符?。
对于每一个Unicode字符呢,占用的字节大小不一样,可是我们怎么知道每次取多少个字节的大小?
所以在Go语言中,我可以使用rune来解决这个问题,不管这个字符占多大的字节,都可以用一个rune来表示。
rune 是 Go 语言的内建类型,它也是 int32 的别称。在 Go 语言中,rune 表示一个代码点。

package main
import "fmt"
func main() {
var s = "Hello world!"
runes := []rune(s)
for i:= 0; i < len(runes); i++ {
fmt.Printf("%c ",runes[i])
}//H e l l o w o r l d ! } 

注:https://naveenr.net/unicode-character-set-and-utf-8-utf-16-utf-32-encoding/ 来理解一下什么是 Unicode 和 UTF-8。

字符串的构造

  • 用字节切片构造字符串
  • 用 rune 切片构造字符串

用字节切片构造字符串

byteSlice 包含字符串 Café 用 UTF-8 编码后的 16 进制字节

用字节切片构造字符串
package main
import (
"fmt"
) func main() {
byteSlice := []byte{0x43, 0x61, 0x66, 0xC3, 0xA9}
str := string(byteSlice)
fmt.Println(str)//Café
}

用 rune 切片构造字符串

 runeSlice 包含字符串 Señor的 16 进制的 Unicode 代码点

package main
import (
"fmt"
) func main() {
runeSlice := []rune{0x0053, 0x0065, 0x00f1, 0x006f, 0x0072}
str := string(runeSlice)
fmt.Println(str)//Café
}

字符串切片处理

func main() {
//字符串底层是一个byte数组,可以做切片处理
str := "hello world!"
//使用切片
slice := str[2:]
fmt.Println("slice=",slice)//slice= llo world!
}

  

字符串长度

获取字符串的字节数len(str)方法返回包含在字符串文字中的字节数。

package main
import "fmt"
func main() {
var greeting = "Hello world!" fmt.Printf("String Length is: ")
fmt.Println(len(greeting)) //String Length is : 12
}

获取字符串的字符个数:utf8 package 包中的 func RuneCountInString(s string) (n int) 方法用来获取字符串的长度。这个方法传入一个字符串参数然后返回字符串中的 rune 的数量。

package main
import (
"fmt"
"unicode/utf8"
)
func length(s string) {
fmt.Printf("length of %s is %d\n", s, utf8.RuneCountInString(s))}
func main() {
word1 := "Señor"
length(word1)//length of Señor is 5
word2 := "Pets"
length(word2)//length of Señor is 4
}

  

字符串的迭代

字符串的迭代有两种方法

package main
import (
"fmt"
)

//方法1,使用for range
func printChars1(s string) {
for index, rune := range s {
fmt.Printf("%c starts at byte %d\n", rune, index)
}
}

//方法2
func printChars2(s string) {
runes := []rune(s)
for i:= 0; i < len(runes); i++ {
fmt.Printf("%c ", runes[i])
}
} func main() {
name := "Señor"
printChars1(name)
printChars2(name)
}

输出结果:

S starts at byte 0
e starts at byte 1
ñ starts at byte 2
o starts at byte 4
r starts at byte 5
S e ñ o r

  

字符串不可变

string 是不可变的,也就说不能通过 str[0] = 'w' 方式来修改字符串。

如果需要修改字符串,可以先将 string -> []byte 或者 []rune -> 修改 -> 重写转成 string

package main

import "fmt"

func main() {
//字符串底层是一个byte数组,可以做切片处理
str := "zello world!"
arr1 := []byte(str)
arr1[0] = 'h'
str = string(arr1)
fmt.Println("str=",str) //转换成byte后,可以处理英文和数字,不能处理中文
//[]byte一个索引只能处理一个字节的数据,汉字超出范围,会出现乱码
//前面我们提到[]rune能将所有字符用一个字节表示
arr2 := []rune(str)
arr2[0] = '一'
str = string(arr2)
fmt.Println("str=",str)
}
结果:
str= hello world!
str= 一ello world!

  

连接字符串

strings包包含一个用于连接多个字符串的join()方法,其语法如下:

strings.Join(sample, " ")

Join连接数组的元素以创建单个字符串。第二个参数是分隔符,放置在数组的元素之间。

package main
import (
"fmt"
"strings"
)
func main() {
greetings := []string{"Hello","world!"}
fmt.Println(strings.Join(greetings, " "))//Hello world!
}

Go 字符串使用的更多相关文章

  1. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  3. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  4. JavaScript 字符串实用常操纪要

    JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...

  5. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  6. Redis的简单动态字符串实现

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...

  7. ASP.NET加密和解密数据库连接字符串

    大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...

  8. Javascript正则对象方法与字符串正则方法总结

    正则对象 var reg = new Regexp('abc','gi') var reg = /abc/ig 正则方法 test方法(测试某个字符串是否匹配) var str = 'abc123'; ...

  9. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  10. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

随机推荐

  1. proj-6.1.1 编译

    Requiring C++11 Requiring C++11 - done Configuring PROJ: PROJ_VERSION = 6.1.1 PROJ_ABI_VERSION = 6_1 ...

  2. Qt编写控件属性设计器4-加载属性

    一.前言 控件能加载拖曳拉伸了,这些都是基本的前提工作,接下来的重点就是要动态加载选中控件的属性了,Qt的属性机制那是异常的强大,只能用强大到爆来形容,Qt中编写自定义控件,如果属性都用Q_PROPE ...

  3. toast提示信息获取和Monkey笔记

    获取toast toast提示信息出现场景:用户输入用户名和密码后,提示的'登录成功', 用之前的定位方法获取不了,需要Uiautomator2来获取 安装node.js (使用 npm 或 node ...

  4. 【425】堆排序方法(二叉堆)优先队列(PQ)

    参考:漫画:什么是二叉堆? 大根堆 小根堆 参考:漫画:什么是堆排序? 参考:漫画:什么是优先队列? 参考:[video]视频--第14周10--第8章排序10--8.4选择排序3--堆排序2--堆调 ...

  5. Mysql迁移由于字符集导致乱码的数据

    有时候会在不注意的情况下创建了字符集为latin1的数据库,导致后续插入的中文显示乱码.这时有两种方法:1.修改数据库与数据表的字符集(只能向上调整,不能向下调整):2.数据迁移.但是两种方法都需要做 ...

  6. Yarn简单介绍及内存配置

    本文出自:http://blog.chinaunix.net/uid/28311809/abstract/1.html 在这篇博客中,主要介绍了Yarn对MRv1的改进,以及Yarn简单的内存配置和Y ...

  7. InfluxDB+Grafana大数据监控系列之基础环境部署(一)

    一.单节点环境部署 机器节点信息及 InfluxDB.Grafana 版本选择: 节点 Linux版本 部署服务 10.223.1.198 Centos 6.8 InfluxDB 1.7.7 10.2 ...

  8. migrate设置

    migrate配置 进入项目manage所在的目录中执行如下命令,否则会报错:no such table: django_session 进入cmd 输入盘符比如:E: 切换目录 cd E:\prog ...

  9. mybatis传入map任意表增删改查,分页过滤字段

    <!--根据实体参数查询 --> <select id="selectBaseList" resultType="java.util.HashMap&q ...

  10. python全栈索引

    书签 python基础 太白金星 TigerLee python基础一 pytcharm安装详细教程 python基础二 python基础数据类型 Python最详细,最深入的代码块小数据池剖析 深浅 ...