字符串的创建
str := "HelloWorld"
获取字符串长度
通过内置len函数获取字符串长度
str := "cooper"
fmt.Printf("字符串的长度是%d\n", len(str))
输出:字符串的长度是6
需要注意的是,内置len函数用在字符串上其实是获取了字符串占用的字节数,对于英文字符来说一个字符占一个字节,因此英文字符串可以使用内置len函数获取长度。到那时对于中文字符来说,就不能使用len函数获取字符串长度了,因为一个中文字符不只是占用一个字节。保险起见,建议大家使用下面两种方法获取字符串长度。
通过string包的Count函数获取字符串长度
这个函数原本的用途是获取第二个字符串在第一个字符串中出现的(非重叠)次数的。用在空字符串上可以获得两个字符之间间隙的个数,间隙的个数+1就是字符串的长度。
str := "cooper"
fmt.Printf("字符串的长度是%d\n", strings.Count(str, "") + 1)
输出:字符串的长度是6
通过utf8包的CountRuneInString函数获取字符串长度
utf8包的路径是$GOROOT/src/unicode/utf8
str := "Cooper"
fmt.Printf("字符串的长度是%d\n", uft8.CountRuneInString(str))
输出:字符串的长度是6
字符串分割
通过strings.Split()函数分割字符串
strings.Split(str, sep)函数的第一个参数是待分割的字符串,第二个参数是分隔符(类型也是字符串)。
str := "hello world"
slice := strings.Split(str, " ")
fmt.Println(slice)
输出:[hello world]
通过strings.Fields()函数分割字符串
strings.Fields(str)函数默认以空格作为分隔符进行分割,并返回字符串切片。因此strings.Split(str, " ")跟strings.Fields(str)的效果是一样的。
str := "hello world"
slice := strings.Fields(str)
fmt.Println(slice)
输出:[hello world]
字符串与数字之间的相互转换
字符串转float
// 字符串转为float32
fnum, err := strconv.ParseFloat(str, 32)
// 字符串转为float64
fnum, err := strconv.ParseFloat(str, 64)
下面是一个转换成功的例子和一个转换失败的例子:
// conv.go
package main
import (
"fmt"
"strconv"
)
func main() {
str1 := "123.45"
if fnum1, err := strconv.ParseFloat(str1, 64); err == nil {
fmt.Printf("通过转换得到%f\n", fnum1)
} else {
fmt.Println(err)
}
str2 := "123..45"
if fnum2, err := strconv.ParseFloat(str2, 64); err == nil {
fmt.Printf("通过转换得到%f\n", fnum2)
} else {
fmt.Println(err)
}
}
字符串转int
val, err := strconv.Atoi(str)
如果字符串不能转为int,则err != nil。
int转字符串
str := strong.Itoa(num)
字符串遍历
str := "coopersong"
for i, c := range str {
fmt.Printf("第%d个字符是%c\n", i, c)
}
需要注意的是,上面的i是字节在整个字符串中的位置,因此由于字符编码的原因,在遍历中文字符串时会出现i值的跳变。
字符串大小写转换
小写转大写
str := strings.ToUpper(originalStr)
大写转小写
str := strings.ToLower(originalStr)
字符串与切片之间的转换
字符串转切片
字符串转字符切片
slice := []byte(str)
字符串转字节切片
slice := []rune(str)
通过下面这个程序可以观察到转换成以上两种切片的区别:
package main
import (
"fmt"
)
func main() {
str := "大家好"
// 转换成字节切片
slice1 := []byte(str)
for i, c := range slice1 {
fmt.Printf("第%d个字符是%c\n", i, c)
}
fmt.Println()
// 转换成字符切片
slice2 := []rune(str)
for i, c := range slice2 {
fmt.Printf("第%d个字符是%c\n", i, c)
}
}
运行结果:
切片转字符串
str := string(slice)
字符串与切片相互转换的意义
Go语言不像其他语言那样,字符串本身是不能被修改的,不能通过str[0] = 'a'这样的语句修改字符串str的第一个字符。但是切片的元素是可以被修改的,因此如果想要修改字符串某个位置上的字符,可以先将其转换成切片,修改完再转换成字符串。