字符与字符串
字符
字符有两种类型:
- uint8类型,也叫byte型,代表ASCII码的一个字符
- rune类型,代表一个UTF-8字符,实际是int32
Golang用rune类型来处理Unicode,让基于Unicode的文本处理更为方便。
可以使用byte型进行默认字符串处理,性能和扩展性都有照顾。
汉字用utf-8编码,占用3字节。如果用GBK编码则占用2字节。
var a = 'a' // 单引号定义字符
var b = "this"
fmt.Printf("值: %v 类型: %T,字符: %c", a,a,a) // 第一个会输出ascii码值97。%c标明输出字符
fmt.Printf("输出字符:%c,输出asc码:%v", b[2], b[2])
字符串
// 字符串转义。转义符自行百度
str1 := "this \n is str"
fmt.Println(str1)
// 定义多行
str :=`
h
e
l
l
o
`
常用方法
| 方法 | 介绍 |
|---|---|
| len(str) | 求长度 |
| +或fmt.Sprintf | 拼接字符串 |
| strings.Split | 分割 |
| strings.contains | 判断是否包含 |
| strings.HasPrefix,strings.HasSuffix | 前缀/后缀判断 |
| strings.Index(),strings.LastIndex() | 子串出现的位置 |
| strings.Join(a[]string, sep string) | join操作,切片转字符串 |
str := "hello world,t" // 如果是汉字,一个字是3字节
name := "ony"
// 长度
fmt.Println(len(str))
//注意,字符串的长度无法使用unsafe.Sizeof(str)查看。如果使用该函数,返回值是字符串的地址长度
// 拼接
fmt.Println(str + name)
// fmt.Sprintf("%v%v", str, name)
// 多行拼接
/*
str1 :="ffff" + // 这个拼接用的+号必须写在一行的末尾
"tttt" +
"nnnn"
*/
// 分割
res := strings.Split(str, ",")
fmt.Println(res)
// 包含
containStr := strings.Contains(str, "hello") // 返回布尔值
// 前、后缀判断
hasSubStr := strings.HasPrefix(str, "he") // 返回布尔值
// 出现位置.无论是从前找还是从后找,返回的位置都是从做向右数的下标值
subStrIndex := strings.Index(str, "el") // 返回位置下标。找不到返回-1
// join切片转字符串
rejoin := strings.Join(res, ",")
// 遍历字符串的字符
cstr := "你好 world"
for _, v := range cstr {
fmt.Printf("%v(%c)", v,v)
}
修改字符串
修改字符串要先转成[]rune 或 []byte,完成后再转换为string。
系统会在转换过程中重新分配内存,并复制字节数组。
s1 := "big"
byteStr = []byte(s1)
// 如果包含汉字要转成runebyteStr = []rune(s1)
byteStr[0] = 'p'
fmt.Println(string(byteStr))
其他类型转字符串
方法一,使用Sprintf
num1 := 10
num2 := 12.333333
t := false
cchar := 'a'
strInt = fmt.Sprintf("%d", num1)
strFloat = fmt.Sprintf("%f", num2)
strBool = fmt.Sprintf("%t", t)
strChar = fmt.Sprintf("%c", cchar)
fmt.Printf("%d", strInt)
fmt.Printf("%f", strFloat)
fmt.Printf("%t", strBool)
fmt.Printf("%c", strChar)
方法二,使用第三方包strconv
num1 := 10
num2 := 12.333333
t := false
cchar := 'a'
s1 := strconv.FormatInt(num1, 10) // 参数2是进制
s2 := strconv.FormatFloat(float64(num2), 'f', -1, 64)
s3 := strconv.FormatBool(t)
s4 := strconv.FormatUint(uint64(cchar), 10)
fmt.Printf("值: %v, 类型: %T \n", s1, s1)
fmt.Printf("值: %v, 类型: %T \n", s2, s2)
fmt.Printf("值: %v, 类型: %T \n", s3, s3)
fmt.Printf("值: %v, 类型: %T \n", s4, s4)
字符串转其他类型
str := "13579"
n1, _ := strconv.ParseInt(str, 10, 64) // 函数会返回两个值,第一个是值,第二个是转换失败时的err
f1, _ := strconv.ParseFloat(str, 64)
b1, _ := strconv.ParseBool("xxxx") // 出了true和false,其他字符都会转换成false
fmt.Printf("%v--%T", n1, n1)
fmt.Printf("%v--%T", f1, f1)