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 协议 ,转载请注明出处!