Go语言入门到实战——00主目录
在上一讲中我们学习了Go语言的map集合相关的知识。
1.string是数据类型,不是引用或者指针类型
2.string的底层是一个不可变的(注意不可变)byte slice(切片),我们可以使用len函数
,但是得到的是byte数,注意byte数不一定就是string的长度,后面会进行演示
3.string的byte数组可以存放任何的数据的(重点)
package test
import "testing"
func TestMap(t *testing.T) {
var s string
t.Log(s) //初始化空字符串
s = "yes"
// s[0] = '1' //string是可变的slice,这行代码会报错
t.Log(s)
t.Log(len(s))
s = "\xE4\xB8\xA5" //这是一个中国汉字
t.Log(s, len(s)) //只有一个汉字字符,长度却是3,证明返回的是byte的长度,
//而不是字符串的字符数
}
在上面的代码当中可能大家会对汉字那部分代码比较好奇,这里讲一下Unicode和UTF-8编码:
1.Unicode是字符集(code point编码方式)
2.UTF-8则是Unicode字符集的存储实现方式(即转化为字节序列的规则)
接下来以代码来加以理解:
package test
import "testing"
func TestMap(t *testing.T) {
var s string = "中"
c := []rune(s) //将s转换为对应的Unicode字符
t.Logf("中 Unicode is %x", c[0])
t.Logf("中 UTF-8 is %x", s)
}
package test
import "testing"
func TestMap(t *testing.T) {
var s string = "中"
for _, c := range s { //c是rune类型
t.Logf("%[1]c %[1]d", c) //[]用来指明使用哪一个参数1代表使用
//第一个参数c(当然这里也只有这一个)
}
}
1.分割与连接
package test
import (
"strings"
"testing"
)
func TestMap(t *testing.T) {
var s string = "A,B,C,D"
parts := strings.Split(s, ",")
for _, val := range parts {
t.Log(val)
}
joins := strings.Join(parts, "-")
t.Log(joins)
}
package test
import (
"strconv"
"testing"
)
func TestMap(t *testing.T) {
var s int = 10
t.Log("abc" + strconv.Itoa(s))
if val, err := strconv.Atoi("10"); err == nil { //看返回是否转换错误
t.Log(1 + val)
}
}