Go语言心得(四) | 青训营笔记

188 阅读5分钟

GO语言

4.5、byte 和rune 类型

         组成每个字符串的元素叫做“字符”,可以通过遍历字符串元素获得字符。字符用单引号(’)包裹起来,如:

package main
import "fmt"
func main() {
    a := 'a'
    b := '0'
    //当我们直接输出byte(字符)的时候输出的是这个字符对应的ASCII码值
    fmt.Println(a)
    fmt.Println(b)
    //如果我们要输出这个字符,需要格式化输出
    fmt.Printf("%c--%c", a, b) //%c 相应Unicode 码点所表示的字符
}

字节(byte): 是计算机中数据处理的基本单位,习惯上用大写B来表示,1B(byte,字节)= 8bit(位)。

字符: 是指计算机中使用的字母、数字、字和符号。

utf-8: 一个汉子占用3 个字节一个字母占用一个字节

a := "m"
fmt.Println(len(a)) //1
b := "张"
fmt.Println(len(b)) //3

4.5.1、Go语言的字符有以下两种:

​ (1)、uint8 类型,或者叫byte 型,代表了ASCII 码的一个字符。

​ (2)、rune 类型,代表一个UTF-8 字符。当需要处理中文、日文或者其他复合字符时,则需要用到rune 类型。rune 类型实际是一个int32Go 使用了特殊的rune 类型来处理Unicode,让基于Unicode 的文本处理更为方便,也可以使用byte 型进行默认字符串处理,性能和扩展性都有照顾。

// 遍历字符串
package main
import "fmt"
func main() {
    s := "hello 张三"
    for i := 0; i < len(s); i++ { //byte
        fmt.Printf("%v(%c) ", s[i], s[i])
    }
    fmt.Println()
    for _, r := range s { //rune
        fmt.Printf("%v(%c) ", r, r)
    }
    fmt.Println()
}

输出:

        104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 229(å) 188(¼) 160( ) 228(ä) 184(¸) 137()

        104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 24352(张) 19977(三)

        因为UTF8 编码下一个中文汉字由3 个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。字符串底层是一个byte 数组,所以可以和[]byte 类型相互转换。字符串是不能修改的字符串是由byte 字节组成,所以字符串的长度是byte 字节的长度。rune 类型用来表示utf8 字符,一个rune 字符由一个或多个byte 组成。

c3 := "营"
c4 := '营'
fmt.Printf("C3 的类型%T--C4 的类型%T", c3, c4) //C3 的类型string--C4 的类型int32

4.6、GoLang 中基本数据类型之间的转换

4.6.1、关于golang 中的数据类型转换

​        Go 语言中只有强制类型转换,没有隐式类型转换。.

4.6.2、数值类型之间的相互转换

​        数值类型包括:整形和浮点型

package main
import "fmt"
func main() {
    var a int8 = 20
    var b int16 = 40
    var c = int16(a) + b //要转换成相同类型才能运行
    fmt.Printf("值:%v--类型%T", c, c) //值:60--类型int16
}
package main
import "fmt"
func main() {
    var a float32 = 3.2
    var b int16 = 6
    var c = a + float32(b)
    fmt.Printf("值:%v--类型%T", c, c) //值:9.2--类型float32
}

​        转换的时候建议从低位转成高位,高位转成低位的时,如果转换不成功就会溢出,和我们想的结果不一样,比如:

package main
func main() {
    var a int16 = 129
    var b = int8(a) // 范围-128 到127
    println("b=", b) //b= -127 //错误
}

         比如,使用math 包的Sqrt()函数,该函数接收的是float64 类型的参数,而变量a 和b 都是int 类型的,这个时候就需要将a 和b 强制类型转换为float64 类型。

var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是float64 类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)

4.6.3、其他类型转换成String 类型

1、sprintf 把其他类型转换成string 类型

****注意:sprintf 使用中需要注意转换的格式int 为%d;float 为%f;bool 为%t;byte 为%c;

2、使用strconv 包里面的几种转换方法进行转换

package main
import (
	"fmt"
	"strconv"
)
func main() {
	//1int 转换成string
	var num1 int = 20
	s1 := strconv.Itoa(num1)
	fmt.Printf("str type %T ,strs=%v \n", s1, s1)
	// 2、float 转string
	var num2 float64 = 20.113123
	strs = fmt.Sprintf("%d", i)
	fmt.Printf("str type %T ,strs=%v \n", strs, strs)
	strs = fmt.Sprintf("%f", f)
	fmt.Printf("str type %T ,strs=%v \n", strs, strs)
	strs = fmt.Sprintf("%t", t)
	fmt.Printf("str type %T ,strs=%v \n", strs, strs)
	strs = fmt.Sprintf("%c", b)
	fmt.Printf("str type %T ,strs=%v \n", strs, strs)
 
	/*
		参数1:要转换的值
		参数2:格式化类型
		'f'(-ddd.dddd)、
		'b'(-ddddp±ddd,指数为二进制)、
		'e'(-d.dddde±dd,十进制指数)、
		'E'(-d.ddddE±dd,十进制指数)、
		'g'(指数很大时用'e'格式,否则'f'格式)、
		'G'(指数很大时用'E'格式,否则'f'格式)。
		参数3: 保留的小数点-1(不对小数点格式化)
		参数4:格式化的类型
	*/
	s2 := strconv.FormatFloat(num2, 'f', 2, 64)
	fmt.Printf("str type %T ,strs=%v \n", s2, s2)
	// 3、bool 转string
	s3 := strconv.FormatBool(true)
	fmt.Printf("str type %T ,strs=%v \n", s3, s3)
	//4、int64 转string
	var num3 int64 = 20
	/*
		第二个参数为进制
	*/
	s4 := strconv.FormatInt(num3, 10)
	fmt.Printf("类型%T ,strs=%v \n", s4, s4)
}

4.6.4、String 类型转换成数值类型

1、string 类型转换成int 类型

var s = "1234"
i64, _ := strconv.ParseInt(s, 10, 64)
fmt.Printf("值:%v 类型:%T", i64, i64)

2、string 类型转换成float 类型

str := "3.1415926535"
v1, _ := strconv.ParseFloat(str, 32)
v2, _ := strconv.ParseFloat(str, 64)
fmt.Printf("值:%v 类型:%T\n", v1, v1)
fmt.Printf("值:%v 类型:%T", v2, v2)

3、string 类型转换成bool 类型(意义不大)

b, _ := strconv.ParseBool("true") // string 转bool
fmt.Printf("值:%v 类型:%T", b, b)

4、string 转字符

s := "hello 张三"
for _, r := range s { //rune
	fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()

4.6.5、数值类型没法和bool 类型进行转换

​        注意:在go 语言中数值类型没法直接转换成bool 类型bool 类型也没法直接转换成数值类型