Go string和字符类型
本文最后更新于:5 分钟前
字符串
Go 语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int,bool,float32,float64等)一样。Go 语言里的字符串的内部实现使用utf-8编码,字符串的值为双引号的内容,可以在Go语言的源码中直接添加非ASCII码子符。例如:
s1 := "hello"
s2: = "你好"
字符串转义符
\r: 回车符(返回行首)
\n: 换行符(直接跳到下一行的同列位置
\t: 制表符
\': 单引号
\": 双引号
\\: 反斜杠
字符串定义
var str1 string
var str2 = "你好"
str3 := "你好"
多行字符串
str1 := `
this a 1
this a 2
this a 3
`
字符串方法
len(str) :求长度
+,fmt.Sprintf :拼接字符串
strings.Split :切割字符串
strings.contains :是否包含
strings.HasPrefix,strings.HasSuffix :前缀和尾缀
strings.Index(),strings.LastIndex() :索引
strings.Join(a[]string,sep string):Join组合
byte和rune类型
组成每个字符串的元素叫做字符,可以通过遍历字符串元素获得字符,字符用单引号包裹起来 ,golang中定义字符 ,字符属于int类型
字节(byte): 是计算机中 数据处理的基本单位,习惯上用大写的B来表示1B 表示(byte,字节)= 8bit(位)
字符: 是指计算机中使用的字母,数字,字和符号
Go 语言的字符类型
- uint8 类型或者叫做byte型,代表了ASCII码的一个字符
- rune 类型,代表一个UTF-8类型
当需要处理中文,日本,或者其他复合字符的时候,则需要用到rune类型,rune类型实际是一个int32
Go 使用投了特殊的rune类型来处理Unicode,让基于Unicode的文本处理更为方便
也可以使用byte类型进行默认字符串处理,性能和扩展性都有照顾
Go 修改字符串
要修改字符串,需要先将其转换成[]rune或者[]byte ,完成后在转换为string,无论那种转换都会重新分配内存,并复制字节数组
代码演示案例
package main
import (
"fmt"
"unsafe"
)
func main() {
//1 2 定义一个字符
var a = 'a'
fmt.Printf("ASCII码值:%v 类型:%T,原始值:%c\n", a, a, a)
//3 定义一个字符串输出字符串里面的字符
var str = "this"
fmt.Printf("值:%v, 类型: %T,原始值 %c \n", str[2], str[2], str[2])
//4 一个汉子占用3个字符(utf-8) 一个字母占用一个字符
//unsafe.Sizeof() : string类型比较特殊 底层是依赖结构体和指针来实现 ,所以Sizeof输出值 不准确
var str1 = "this"
fmt.Println(unsafe.Sizeof(str1))
fmt.Println(len(str1)) //通过len()来获取字符串长度
//5 定义一个字符 字符的值是汉字
var a1 = '国'
fmt.Printf("值:%v,类型:%T\n", a1, a1)
//6 通过循环输出字符串里面的字符
s := "你好 golang"
for i := 0; i < len(str); i++ { //表示通过byte类型循环
fmt.Printf("%v,%c\n", s[i], s[i])
}
fmt.Println("-------")
for _, v := range s { //表示通过rune类型循环
fmt.Printf("%v,%c\n", v, v)
}
//7 修改字符串
s1 := "big"
byteStr := []byte(s1)
byteStr[0] = 'p'
fmt.Println(string(byteStr))
s2 := "hello 中国"
runeStr := []rune(s2)
runeStr[6] = '某'
fmt.Println(string(runeStr))
}
类型转换
数值类型之间的转换
数值类型包括: 整形和浮点型
注意: 转换的时候建议从地位转为高位,因为转换不成功可能会溢出 比如int8 转为 int16
//1 int类型之间转换
var a int8 = 20
var b0 int16 = 10
fmt.Println(int16(a) + b0)
//2 浮点类型之间转换
var a1 float32 = 10.1
var b1 float64 = 10.2
fmt.Println(float32(b1) + a1)
//3 整形和浮点型之间的转换
var a2 float32 = 20.3
var b2 int = 30
fmt.Println(a2 + float32(b2))
把其他类型转为string类型
注意: Sprintf
使用中需要注意转换的额格式:int -> %d
,float -> %f
,bool -> %t
, byte ->%c
var i int = 10
var f float64 = 12.1
str1 := fmt.Sprintf("%d", i)
fmt.Printf("值:%v,类型: %T\n", str1, str1)
str2 := fmt.Sprintf("%.2f", f) //.2 代表保留俩位小数
fmt.Printf("值:%v,类型: %T\n", str2, str2)
使用strconv包转换
把整形转为string类型
//参数1 : int64的数值
//参数2 : int类型的进制
var i1 int = 20
str3 := strconv.FormatInt(int64(i1), 10)
fmt.Printf("值:%v,类型:%T", str3, str3)
把浮点数转为string类型
//参数1: 要转换的值
//参数2: 格式化类型 'f'(-ddd.ddd)
//参数3: 保留的小数值 (-1,不对小数点做格式化)
//参数4:格式化的类型( 32 64 )
var f1 float32 = 20.3333
str4 := strconv.FormatFloat(float64(f1), 'f', 4, 64)
fmt.Printf("值:%v,类型:%T\n", str4, str4)
把string类型转为数值类型
// string -> 数值 int 转换失败返回0
/*
参数1: string数据
参数2: 进制
参数3: 位数 32 64 16
*/
str5 := "123456"
num, _ := strconv.ParseInt(str5, 10, 64)
fmt.Printf("值:%v,类型:%T\n", num, num)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!