字符串

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))

字符串的拼接等处理

  1. 字符串的拼接 Join 此处字符串的拼接只针对与Slice切片后的管用,且拼接的地方在每个被切片的后面 Strings.Join(sl []string, sep string)
示例:
s := []string{"111","2222","333","4444"}
str := strings.Join(s,"--")

得到的结果为:
    111--2222--333--4444
  1. 直接相加
可以直接与相加拼接 例如 "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 系列函数把其他类型的转换为字符串

  1. FormatBool 将bool类型转换为字符串
    var str string
    str = strconv.FormatBool(false)
    fmt.Println(str)
  1. 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))
  1. 将不同的类型转换成字符串并添加
	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