GO学习2:基本数据类型 与 转换
目录
前言
1. 基本数据类型
1.1 整型
1.1.1 分类
1.1.2 特殊整型
1.1.3 unsafe.Sizeof
1.1.4 int不同长度直接的转换
1.1.5 数字字面量语法(Number literals syntax)
1.2 浮点型
1.2.1 概述
1.2.2 golang中float精度丢失问题
1.2.3 golang科学计数法表示符点类型
1.3 布尔值
1.4 字符串
1.4.1 字符串转义符
1.4.2 多行字符串
1.4.3 字符串的常用操作
1.5 byte和rune类型
Go语言的字符有两种类型
1.6 修改字符串
2.基本数据类型之间的转换
2.1 数值类型之间的相互转换
2.2 其他类型转换成string类型
2.2.1 sprintf把其他类型转换成string类型
2.2.2 使用strconv包里面的几种转换方法进行转换
2.3 string类型转换成数值类型
2.3.1 string类型转换成int类型
2.3.2 string类型转换成float类型
2.3.3 string类型转换成bool类型(意义不大)
2.3.4 string转字符
2.4 数值类型没法和bool类型进行转换
前言
Go语言中数据类型分为两类:
基本数据类型
复合数据类型
基本数据类型有:
整型、浮点型、布尔型、字符型
复合数据类型有:
数组、切片、结构体、函数、map、通道(channel)、接口等。
1. 基本数据类型
1.1 整型
1.1.1 分类
编码格式 | 一个中文字符占用字节 | 核心特点与应用场景 |
---|---|---|
GB2312 / GBK 国标 | 2 字节 | - 中国国家标准编码,专门用于处理中文; - GB2312 仅支持 6763 个常用汉字,GBK 扩展后支持 2 万 + 汉字(含生僻字); - 主要场景:Windows 系统默认中文编码(如记事本保存为 “ANSI” 时,中文系统下实际是 GBK)、早期中文软件 / 文档。 |
UTF-8 | 3 字节(部分生僻字 4 字节) | - 国际通用的 “万国码”,可兼容全球所有语言(中文、英文、日文等); - 设计灵活:英文占 1 字节,中文占 3 字节,极少数生僻字(如 “𪚥”)占 4 字节; - 主要场景:网页(HTML 默认编码)、数据库(如 MySQL 默认)、程序代码(如 Java/Python)、移动 APP,是当前互联网和软件开发的主流编码。 |
UTF-16 | 2 字节 或 4 字节 | - 另一种 Unicode 编码格式,分 “小端序(UTF-16LE)” 和 “大端序(UTF-16BE)”; - 大部分常用汉字(如 “中”“国”)占 2 字节,超出基础字符集的生僻字占 4 字节; - 主要场景:Windows 系统内部处理(如记事本 “Unicode” 选项)、.NET 程序、部分文档格式(如 Office 文件)。 |
测试:
- 新建记事本,输入 1 个中文字符(如 “我”),分别用不同编码保存:
- 保存为 “ANSI”(中文系统 = GBK):文件大小 2 字节;
- 保存为 “UTF-8”:文件大小 3 字节(若勾选 “带 BOM”,会多 3 字节标识,总 6 字节,实际字符仍占 3 字节);
- 保存为 “Unicode”(UTF-16LE):文件大小 4 字节(含 2 字节字节序标识,实际字符占 2 字节)。
1.1.2 特殊整型
package mainimport "fmt"func main() {var num int64num = 123fmt.Printf("值为:%v 类型:%T\n", num, num) //值为:123 类型:int64
}
1.1.3 unsafe.Sizeof
unsafe.Sizeof(n1) 是 unsafe 包的一个函数,可以返回 n1 变量占用的字节数。
package mainimport ("fmt""unsafe"
)func main() {var a int8 = 120fmt.Printf("%T\n", a) //int8fmt.Println(unsafe.Sizeof(a)) //1
}
1.1.4 int不同长度直接的转换
package mainimport ("fmt"
)func main() {var num1 int8num1 = 127num2 := int32(num1)fmt.Printf("值为:%v 类型:%T", num2, num2)//值为:127 类型:int32
}
1.1.5 数字字面量语法(Number literals syntax)
##1. 十进制
import "fmt"func main() {var a inta = 10fmt.Printf("%d\n", a) //10fmt.Printf("%b\n", a) //1010
}
##2. 八进制 以 0 开头
package main
import "fmt"func main() {var a inta = 077fmt.Printf("%o\n", a) //77
}
##3. 十六进制 以0x开头
package mainimport "fmt"func main() {var a inta = 0xfffmt.Printf("%x\n", a) //fffmt.Printf("%X\n", a) //FFfmt.Printf("%d\n", a) //255
}
1.2 浮点型
1.2.1 概述
package mainimport ("fmt""math"
)func main() {fmt.Printf("%f\n", math.Pi) //3.141593 默认保留 6 位小数fmt.Printf("%.2f\n", math.Pi) //3.14
}
Go语言中浮点数默认是float64
num := 1.1fmt.Printf("值: %v --类型:%T", num, num) //值: 1.1 --类型:float64
1.2.2 golang中float精度丢失问题
d := 1129.6
fmt.Println((d * 100)) //112959.99999999999
var d float64 = 1129.6
fmt.Println((d * 100)) //112959.99999999999
m1 := 8.2
m2 := 3.8
fmt.Println(m1 - m2) //期望是 4.4,但是打印出了4.3999999999999995
可以使用第三方包来解决精度损失问题:
1.2.3 golang科学计数法表示符点类型
num1 := 5.1234e2 //5.1234 * 10 的 2 次方num2 := 5.1234e2 //5.1234 * 10 的 2 次方 shift+alt+向下的箭头num3 := 5.1234e-2 //5.1234 / 10 的 2 次方 0.051234fmt.Println("num1=", num1, "num2=", num2, "num3=", num3) //num1= 512.34 num2= 512.34 num3= 0.051234
1.3 布尔值
注意:1. 布尔类型变量的默认值为 false。2. Go 语言中不允许将整型强制转换为布尔型.3. 布尔型无法参与数值运算,也无法与其他类型进行转换。
package mainimport ("fmt""unsafe"
)func main() {var a = truefmt.Println(a, "占用字节:", unsafe.Sizeof(a)) //true 占用字节: 1
}
1.4 字符串
s1 := "hello"
s2 := "你好"
1.4.1 字符串转义符
//str := "D:\godemo\demo01\main.go"
fmt.Println("str := \"D:\\godemo\\demo01\\main.go\"")
1.4.2 多行字符串
s1 := `第一行第二行第三行`fmt.Println(s1)
s1 := `"hello"
"hi"
"你好"
`fmt.Println(s1)//"hello"//"hi"//"你好"
1.4.3 字符串的常用操作
$$1. len(str)求字符串的长度
var str = "this is str"fmt.Println(len(str))//11
$$2. 拼接字符串
var str1 = "您好"var str2 = "golang"fmt.Println(str1 + str2) // 您好golangvar str3 = fmt.Sprintf("%v %v", str1, str2)fmt.Println(str3) //您好 golang
$$3. strings.Split 分割字符串
var str = "123-456-789"var arr = strings.Split(str, "-")fmt.Println(arr) //[123 456 789]fmt.Printf("%T \n", arr) //[]stringfmt.Printf("%T \n", arr[0]) //string
$$4. 判断包含字符串
var str = "this is golang"var flag = strings.Contains(str, "golang")fmt.Println(flag) //true
$$5. 判断首字符尾字母是否包含指定字符
var str = "this is golang"var flag = strings.HasPrefix(str, "this")fmt.Println(flag) //trueflag = strings.HasSuffix(str, "go")fmt.Println(flag) //false
$$6. 判断字符串出现的位置
var str = "this is golang"var index = strings.Index(str, "is") //从前往后fmt.Println(index) //2index = strings.LastIndex(str, "is") //从后往前fmt.Println(index) //5
$$7. Join拼接字符串
var str = "123-456-789"
var arr = strings.Split(str, "-")var str2 = strings.Join(arr, "*")fmt.Println(str2) //123*456*789
1.5 byte和rune类型
a := 'a'b := 'b'//当我们直接输出 byte(字符)的时候输出的是这个字符对应的码值fmt.Println(a) //97fmt.Println(b) //98//%c 相应 Unicode 码点所表示的字符fmt.Printf("%c--%c\n", a, b) //a--b
a := "m"fmt.Println(len(a)) //1b := "张"fmt.Println(len(b)) //3
Go语言的字符有两种类型
1. uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。2. rune 类型,代表一个 UTF-8 字符。
s := "hello 张三"for i := 0; i < len(s); i++ { //bytefmt.Printf("%v(%c) ", s[i], s[i])}//104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 229(å) 188(¼) 160( ) 228(ä) 184(¸) 137() fmt.Println()for _, r := range s { //runefmt.Printf("%v(%c) ", r, r)}//104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 24352(张) 19977(三) fmt.Println()
c3 := "营"c4 := '营'fmt.Printf("C3 的类型%T--C4 的类型%T", c3, c4) //C3 的类型 string--C4 的类型 int32
1.6 修改字符串
func changeString() {s1 := "big"//强制类型转换byteS1 := []byte(s1)byteS1[0] = 'p'fmt.Println(string(byteS1))s2 := "白萝卜"runeS2 := []rune(s2)runeS2[0] = '红'fmt.Println(string(runeS2))
}
2.基本数据类型之间的转换
2.1 数值类型之间的相互转换
数值类型:
整型和浮点型
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.2var b int16 = 6var c = a + float32(b)fmt.Printf("值:%v--类型%T", c, c) //值:9.2--类型 float32
}
package main
func main() {var a int16 = 129var b = int8(a) // 范围 -128 到 127println("b=", b) //b= -127 //错误
}
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是 float64 类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
2.2 其他类型转换成string类型
2.2.1 sprintf把其他类型转换成string类型
注意:sprintf 使用中需要注意转换的格式int 为%dfloat 为%fbool 为%tbyte 为%c
package main
import "fmt"
func main() {var i int = 20var f float64 = 12.456var t bool = truevar b byte = 'a' var strs stringstrs = fmt.Sprintf("%d", i)fmt.Printf("str type %T ,strs=%v \n", strs, strs)//str type string ,strs=20strs = fmt.Sprintf("%f", f)fmt.Printf("str type %T ,strs=%v \n", strs, strs)//str type string ,strs=12.456000strs = fmt.Sprintf("%t", t)fmt.Printf("str type %T ,strs=%v \n", strs, strs)//str type string ,strs=truestrs = fmt.Sprintf("%c", b)fmt.Printf("str type %T ,strs=%v \n", strs, strs)//str type string ,strs=a
}
2.2.2 使用strconv包里面的几种转换方法进行转换
package main
import ( "fmt""strconv"
)
func main() {//1、int 转换成 stringvar num1 int = 20s1 := strconv.Itoa(num1)fmt.Printf("str type %T ,strs=%v \n", s1, s1)// 2、float 转 stringvar num2 float64 = 20.113123/* 参数 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 转 strings3 := strconv.FormatBool(true)fmt.Printf("str type %T ,strs=%v \n", s3, s3)//4、int64 转 stringvar num3 int64 = 20/*第二个参数为 进制*/s4 := strconv.FormatInt(num3, 10)fmt.Printf("类型 %T ,strs=%v \n", s4, s4)
}
2.3 string类型转换成数值类型
2.3.1 string类型转换成int类型
var s = "1234"
i64, _ := strconv.ParseInt(s, 10, 64)
fmt.Printf("值:%v 类型:%T", i64, i64)
2.3.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)
2.3.3 string类型转换成bool类型(意义不大)
b, _ := strconv.ParseBool("true") // string 转 bool
fmt.Printf("值:%v 类型:%T", b, b)
2.3.4 string转字符
s := "hello 张三"
for _, r := range s { //runefmt.Printf("%v(%c) ", r, r)
}
fmt.Println()