一看就懂系列之Golang的String

Posted 咖啡色的羊驼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一看就懂系列之Golang的String相关的知识,希望对你有一定的参考价值。

前言

今天在写代码的时候,遍历Golang中的字符串时候,发现竟然和想象中不同,从而认真研究了一下,做个记录希望与string做一个了断,这是一篇实战贴。

你将知道以下知识点:
1.字符串的组成
2.如何遍历字符串?
3.如何将字符串与整型互转
4.如何改变其中某个字符?
5.如何截取字符串?
6.如何计算长度
7.如何连接字符串?

正文

1.字符串的组成

Golang的字符串都是由单个字节连接起来的,每个字节都是UTF8编码标识的Unicode文本。(不需要在考虑中文不兼容问题)

2.如何遍历字符串?

先看一个例子:

    var str = "123"
	for i := 0; i < len(str); i++ 
		fmt.Println(str[i])
	

输出:

49
50
51

我去,和想象中不太一样,接着看下面。

遍历有两种方式:
1.for i:=0;i<len;i++
2.for k,v:=range string

区别在于第一种遍历的事ASCII字符,第二种是Unicode字符,当遇到汉字的时候第一种就会乱码了。这也就解释了前文为啥不是输出123了,需要格式化ASCII码才是我们想看到的。

第一种

	var str = "123咖啡色的羊驼"
	for i := 0; i < len(str); i++ 
		fmt.Printf("%c\\n", str[i])
	

输出:

	1
	2
	3
	å
’...(后面是乱码)

这里乱码原因需要解释下:
在遍历的时候,ASCII字符只需要一个字节,而非ASCII 字符的可能需要不2或者3、4个字节不固定,所以碰到非ASCII 字符的用str[i]来获取一个字节,获取的不全,肯定就乱码了。

有什么办法解决乱码呢?
那就是转为rune类型的切片就好了

	var str = "123咖啡色的羊驼"
	strRune := []rune(str)
	for _, v := range strRune 
		fmt.Printf("%c\\n", v)
	

输出:

1
2
3
咖
啡
色
的
羊
驼

因为在Golang中字符类型实际存储使用rune的

第二种

	var str = "123咖啡色的羊驼"
	for _, v := range str 
		fmt.Printf("%c\\n", v)
	

输出:

1
2
3
咖
啡
色
的
羊
驼

3.如何将字符串与整型互转

转换表达
string -> intstring, _ := strconv.Atoi(“1”)
int -> stringint := strconv.Itoa(1)
string -> int64int64, _ := strconv.ParseInt(“1”, 10, 64)
int64 -> stringstring := strconv.FormatInt(1, 64)
int -> int64string := strconv.FormatInt(1, 64)

4.如何改变其中某个字符?

根据前文我们知道字符有两种,一种是ASCII,一种是Unicode。
所以需要根据不同的字节数来替换。

	str := "123咖啡色的羊驼"
	bytes := []byte(str)
	bytes[1] = 'a'
	str = string(bytes)
	fmt.Println(str)

输出:

	1a3咖啡色的羊驼

如果是想兼容汉字那么使用rune:

	str := "123咖啡色的羊驼"
	runes := []rune(str)
	runes[4] = 'a'
	str = string(runes) 
	fmt.Println(str)

输出:

	123咖a色的羊驼

5.如何截取字符串?

substr := str[n:m] 左开右闭

6.如何计算长度

若全为ASCII字符,则len(str)
若存在非ASCII的Unicode字符,则utf8.RuneCountInString(str)
//字符串中字符全为ASCII中的字符
len(str)
//字符串中含非ASCII的Unicode字符
utf8.RuneCountInString(str)

7.如何连接字符串?

提供三种方式:

第一种(最简单):使用+

	str1 := "123"
	str2 := "咖啡色的羊驼"
	fmt.Println(str1 + str2)

第二种(最高效):使用字节拼接

	str1 := "123"
	str2 := "咖啡色的羊驼"
	
	var buf bytes.Buffer
	buf.WriteString(str1)
	buf.WriteString(str2)
	fmt.Println(buf.String())

第三种:使用系统包

	str1 := "123"
	str2 := "咖啡色的羊驼"
	
	str := strings.Join([]stringstr1,str2,"")
	fmt.Println(str)
	os.Exit(1)

如果你觉得有收获~可以关注我的公众号【咖啡色的羊驼】~第一时间收到我的分享和知识梳理~

以上是关于一看就懂系列之Golang的String的主要内容,如果未能解决你的问题,请参考以下文章

一看就懂系列之Golang的反射

一看就懂系列之Golang的pprof

一看就懂系列之Golang的pprof

一看就懂系列之Golang的Map如何做到最省空间?

一看就懂系列之Golang的Map如何做到最省空间?

一看就懂RPC之Http调用