Go字符串 && strings包
Go字符串 && strings包
秋风醉了 发表于1年前
Go字符串 && strings包
  • 发表于 1年前
  • 阅读 23
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: Go字符串 && strings包

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=======

共有 人打赏支持
粉丝 215
博文 610
码字总数 434752
×
秋风醉了
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: