TOC
golang当中的字符串本质是只读的字符型数组,和C语言当中的char[]类似,但是golang为它封装了一个变量类型,叫做string。
1.使用双引号
str := "I am a string"反引号的特点: 不解析内部字符串,因此不需要反斜杠\转义, 例如:
str := `{"name": "zhangsan", "age": 18}`len("hello")结果是:5
len("hello 世界")结果是:12
为什么不是8呢? 因为在utf-8编码当中,一个汉字需要3个字节编码。要想按照我们希望的统计出结果为 8,就需要使用到rune(具体rune章节会介绍),它表示单个unicode字符。
因此,可以这样统计中文:
len([]rune("hello 世界"))结果是: 8
str1 := "hello"
str2 := "world"
str3 := str1 + str2
fmt.Println(str3)结果是: helloworld
也可以使用fmt.Sprintf(),例如:
str2 := "world"
str3 := fmt.Sprintf("hello %s", str2)
fmt.Println(str3)结果也是:hello world
从长度计算的例子中,我们其实就已经使用到了类型转换:[]rune("hello 世界") 将一个字符串转换成 rune类型。
str1 := "I am a string"
// 转化成rune
rune1 := []rune(str1)
fmt.Println(rune1)
// 转化成[]byte类型
byte1 := []byte(str1)
fmt.Println(byte1)
	str2 := "100"
num2, _ := strconv.Atoi(str2)
fmt.Println(reflect.TypeOf(num2))  //结果为: int
num3, _ := strconv.ParseInt(str2, 10, 64)
fmt.Println(num3, reflect.TypeOf(num3))   //结果为:100 int64
num1 := 200
str3 := strconv.Itoa(num1)
fmt.Println(reflect.TypeOf(str3))  //结果为: string其中 strconv.ParseInt(str2, 10, 64) 中,第二个参数10表示十进制,第三个参数64表示值的范围,并不影响结果数据类型。例如:
str2 := "300"
num3, _ := strconv.ParseInt(str2, 10, 0)
fmt.Println(num3, reflect.TypeOf(num3))     //结果为:300 int64
num4, _ := strconv.ParseInt(str2, 10, 8)
fmt.Println(num4, reflect.TypeOf(num4))     //结果为:127 int64
num5, _ := strconv.ParseInt(str2, 10, 32)
fmt.Println(num5, reflect.TypeOf(num5))     //结果为:300 int64类型都是 int64, 但是最大和最小值,受到范围的影响。第三个8位,表示int8的取值范围-127,127的区间,因此最大值只能是127
整数转字符串除了上面使用的strconv.Itoa外,还可以使用strconv.FormatInt来格式化成字符串。
num1 := 200
num6 := strconv.FormatInt(int64(num1), 10)
fmt.Println(num6, reflect.TypeOf(num6))         //结果为:200 string
num7 := strconv.FormatInt(int64(num1), 16)
fmt.Println(num7, reflect.TypeOf(num6))         //结果为:c8 string浮点数转字符串
num := 1234567.654321
num8 := strconv.FormatFloat(float64(num), 'f', -1, 64)
fmt.Println(num8, reflect.TypeOf(num8))     //结果为:1234567.654321 string
num9 := strconv.FormatFloat(float64(num), 'e', -1, 64)
fmt.Println(num9, reflect.TypeOf(num9))     //结果为: 1.234567654321e+06 string第二个参数为格式化,'f'表示普通模式,注意这里的'f'是字符,不是字符串,还有其他的格式化模式:
strconv包还支持与bool类型进行转换,将字符串转成bool类型用的是ParseBool,它只有一个参数,只接受0,1,t,f,T,F,ture,false,True,False,TRUE,FALSE这几种取值。
字符串转bool
flag, err := strconv.ParseBool("t")
fmt.Println(flag, err)          //结果为:true <nil>
flag, err = strconv.ParseBool("f")
fmt.Println(flag, err)          //结果为:false <nil>
flag, err = strconv.ParseBool("true")
fmt.Println(flag, err)          //结果为:true <nil>
flag, err = strconv.ParseBool("false")
fmt.Println(flag, err)          //结果为:false <nil>
flag, err = strconv.ParseBool("1")
fmt.Println(flag, err)          //结果为:true <nil>
flag, err = strconv.ParseBool("0")
fmt.Println(flag, err)          //结果为:false <nil>bool转字符串
str := strconv.FormatBool(true)
fmt.Println(str, reflect.TypeOf(str))  //结果为:true stringstrings包提供了很多字符串运算的方法。
str1 := "hello"
str2 := "hello"
res := strings.Compare(str1, str2)
fmt.Println(res)	//结果为0表示相等,-1表示小于,1表示大于str3 := " hello    "
res2 := strings.Trim(str3, " ")
fmt.Println(res2) //结果为:hello
str4 := "123hello123"
res3 := strings.Trim(str4, "123")
fmt.Println(res3) //结果为:hellores5 := strings.Contains("hello", "ell")
fmt.Println(res5) //结果为:trueres6 := strings.Index("hello", "e")
fmt.Println(res6)   //结果为:1 ,-1表示不包含res7 := strings.Index("hello", "l")
fmt.Println(res7)   //结果为:2
res8 := strings.LastIndex("hello", "l")
fmt.Println(res8)  //结果为:3res9 := strings.Replace("hello world world", "world", "golang", -1)
fmt.Println(res9) //结果为:hello golang golang
res9 = strings.Replace("hello world world", "world", "golang", 1)
fmt.Println(res9) //结果为:hello golang world最后一个参数表示替换次数,-1表示替换全部,整数表示对应的替换次数
将字符串切割成数组
slice := strings.Split("hello world", " ")
fmt.Println(slice, reflect.TypeOf(slice)) //结果为:[hello world] []string将数组拼接成字符串
slice1 := []string{
	"hello",
	"golang",
	"world",
}
str := strings.Join(slice1, ",")
fmt.Println(str, reflect.TypeOf(str)) //结果为:hello,golang,world string以上只展示一些最常见的例子,还有很多字符串运算的方法,在这里就不一一列举了,感兴趣的可以自我尝试一下。
Golang中对字符串的操作和运算提供了大量的方法,本篇只是简单的做一个介绍,比较适合新手当做例子用来查看。针对Golang中的字符串的底层实现原理,请关注《Golang字符串的底层原理》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。