字符串
golang的字符串是只读的unicode字节序列,Go语言使用UTF-8格式编码Unicode字符,每个字符对应一个rune类型。一旦字符串变量赋值之后,内部的字符就不能修改。
[]rune(str)可将不可变的字符串变成数组类型,方便后续更给等。
go 语言字符串的处理
go语言字符串与python等想象 都是不可变类型,内部指针只想UTF-8字节数组
具有以下类型:
1.默认值是空字符串"".
2.用索引下标可以访问某个字节,用法与python相同 例如 s[i]
3.不能用序号获取字节元素指针, 例如$s[i]非法。
4. 不可变类型,无法修改字节数组。
5.字节数组尾部不包含NULL.
go 字符串的切片输出
例如打印输出
func zifuchuan(){
s:="abcdefg"
fmt.Printf("%c",s[0]) ///结果是a
fmt.Printf("%q",s[0]) ///结果是'a'
fmt.Printf("%s",s[0]) ///结果为%!s(uint8=97)
fmt.Println(a) ///输出结果为 97
}
字符串切片都是按照字节码切片的 假如事中文字符串 可以先 []rune(s)
然后在下标
go 字符串长度注意点
若是全部为英文与数字 则直接fmt.Println(len(str))
若字符中有中文等 ,go会直接转换成asii码的字节码 若是想要正确的输出则用 fmt.Println(utf8.RuneCountInString(str))
字符串的拼接等处理
- 字符串的拼接 Join 此处字符串的拼接只针对与Slice切片后的管用,且拼接的地方在每个被切片的后面 Strings.Join(sl []string, sep string)
示例:
s := []string{"111","2222","333","4444"}
str := strings.Join(s,"--")
得到的结果为:
111--2222--333--4444
- 直接相加
可以直接与相加拼接 例如 "hello"+"golang" = "hellogolang"
go 字符串的转义符
因为go的源文件都是用utf-8编码的
- \a 响铃
- \b 退格
- \f 换页
- \n 换行
- \r 回车
- \t 制表符
- \v 垂直制表符
- ' 单引号 (只用在 ''' 形式的rune符号面值中)
- " 双引号 (只用在 "..." 形式的字符串面值中)
- \ 反斜杠
关于对字符串的前缀后缀判断 HasPrefix/HasSuffix
首先需要调用strings包
strings.HasPrefix(s, prefix string) bool
strings.HasSuffix(s, suffix string) bool
fmt.Println(strings.HasPrefix(s,"ab")) ///strings包中的HasPrefix 判断字符串是否以某个单词开头 结果为true或者false
fmt.Println(strings.HasSuffix(s,"fg")) ///strings包中的HasSuffix 判断字符串是否以某个单词开头 结果为true或者false
关于字符串的包含关系 Contains
首先需要调用strings包
Contains 判断字符串 s 是否包含substr
strings.Contains(s, substr string) bool
fmt.Println(strings.Contains(s,"e")) ///strings包中的Contains 判断字符串是否包含某个单词,结果为true或者false
字符串的下标索引 Index
strings.Index(s, str string) int
fmt.Println(strings.Index(s,"e")) ///strings包中的Index 查找相应的字符并返回该字符的下标索引 若为中文则一个中文按照三个字节计算。
字符串的替换 Replace
首先需要调用strings包
strings.Replace(str, old, new, n) string
a:=strings.Replace(s1,"a","t",-1) // 若n为-1 则为全部替换所有的匹配的字符串
fmt.Println(a)
统计字符串出现的次数 Count
首先需要调用strings包
strings.Count(s, str string) int
fmt.Println(strings.Count(s1,"a")) /// 统计字符串出现的个数
重复字符串 Repeat
首先需要调用strings包
Repeat 用于重复 count 次字符串 s 并返回一个新的字符串。
strings.Repeat(s, count int) string
fmt.Println(strings.Repeat(s1,2)) ///貌似没什么卵用的感觉,纯粹复制
fmt.Println(strings.Repeat(s,2*3)) ///貌似没什么卵用的感觉,纯粹复制
修改字符串的大小写 ToLower/ToUpper
strings.ToUpper(s) string ///将所有的字符转变成大写
strings.ToLower(s) string ///将所有的字符转变成小写
修剪字符串
- strings.TrimSpace(s) 剔除字符串开头和结尾的空白符号。
- 用 strings.Trim(s, "字符") 将开头和结尾的 cut 去除掉。
- strings.TrimLeft(s, "字符") 提出开头指定支付
- strings.TrimRight(s, "字符") 剔除结尾指定字符
fmt.Println(strings.Trim(s,"a")) ///剃除开头和结尾a字符
fmt.Println(strings.TrimLeft(s,"a")) ///只剃除开头a字符
fmt.Println(strings.TrimRight(s,"a")) ///只剃除结尾a字符
分割字符串 Fields(s)/Split(s, sep)
strings.Fields(s) 将会利用 1 个或多个空白符号来作为动态长度的分隔符将字符串分割成若干小 块,并返回一个 slice,如果字符串只包含空白符号,则返回一个长度为 0 的 slice。
Slice go语言的切片
Go语言的切片是对数组的抽象 相当于将内存的每个打断重新组合单独的个一个数据结构 然后再将所有的数据结构指向一个列表。
Go数组的长度不可改变,Go提供了以中灵活的(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
---->>>个人理解 本质上还是个数组,但切片的确切的要知道有多个下标 切片是可索引的,并且可以由 len() 方法获取长度。
切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。 cap()只针对被Slice切片后有作用。
从字符串中读取内容
字符串反转
只能通过先转换成[]rune() 然后在首位依次倒转
func reverseString(s string) string {
runes := []rune(s)
for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 {
runes[from], runes[to] = runes[to], runes[from]
}
return string(runes)
}
字符串转换
Format
Format 系列函数把其他类型的转换为字符串
- FormatBool 将bool类型转换为字符串
var str string
str = strconv.FormatBool(false)
fmt.Println(str)
- ParseBool 字符串转bool类型
str:="false"
bool,_:=strconv.ParseBool(str)
fmt.Println(bool,reflect.TypeOf(bool)) // 只能转换true flase字符串转换 其他都是false
3.FormatInt 进制转换
var str string
str = strconv.FormatInt(5555,8) // 第一个参数为需要转换的int ,第二个参数为需要转换的进制 例如 2 8 16 32
fmt.Println(str)
4.ParseInt 二进制字符串转int类型
1.
str:="11101001001" // 格式需规范 否则转出结果为0
// 第一个参数为需要转化的二进制字符串,第二个为需要转换的进制(编码格式),第三个为64进制 用其他的可能会导致丢失 直接用最大类型。
ints,_:=strconv.ParseInt(str,2,64)
fmt.Println(ints,reflect.TypeOf(ints))
2.
str:="12345"
str1,_:=strconv.Atoi(str)
5.FormatFloat 浮点转换
var str string
// FormatFloat 四个参数 第一个为需要转换的数据,第二个为需要转换的类型(f为小数的格式g 整数),第三个为需要保留的小数点位数(会四舍五入),第四个为浮点进制(32或64)
str = strconv.FormatFloat(5555.1234567,'f',4,32)
fmt.Println(str)
6.ParseFloat 字符串转换为float
// 二进制字符串转int类型
str:="33434.4545" // 格式需规范 否则转出结果为0
// 第一个参数为需要转化的字符串, 第二个为位数进制
float1,_:=strconv.ParseFloat(str,64)
fmt.Println(float1,reflect.TypeOf(float1))
5.将整形转换成字符串
var str string
str = strconv.Itoa(5555)
fmt.Println(str)
另:
var str string ="12345"
var int1 int = 123456
str1 := strconv.Itoa(int1) //int 转字符串
fmt.Println(str1,reflect.TypeOf(str1))
str2,_:=strconv.Atoi(str) // int类型的字符串转string
fmt.Println(str2,reflect.TypeOf(str2))
- 将不同的类型转换成字符串并添加
b:=make([]byte,0,1024)
b = strconv.AppendBool(b,true) //添加布尔值进入切片
b = strconv.AppendInt(b,9876,10) //添加int 第二个为需要添加的数,第三个为进制位数
b=strconv.AppendFloat(b,1.23456789,'f',6,64) // 添加浮点数
b = strconv.AppendQuote(b,"字符串") // 添加字符串
fmt.Println(string(b),reflect.TypeOf(b))
输出结果为;
true98761.234568"字符串" []uint8