9、go的数据类型
golang默认都是使用utf-8编码
9.1基本数据类型
数值型
整数:默认0 有符号int 32位系统4个字节,64位系统8个字节,int8,int16,int32,int64 无符号uint,uint8,uint16,uint32,uint64 rune
有符号,类似int32,标识一个unicode码,处理中文常用 byte 单个字母字符 0-255 默认int 浮点:float32 单精度 4 个字节 ±3.403E38 float64 双精度 8个字节 ±1.798E308
符号位+指数位+尾数位
package main
import (
"fmt"
"unsafe"
)
func main() {
var a int = 8900 //定义一个整数变量及赋值
fmt.Println("a=", a)
var b uint = 1
var c byte = 255 // 256就超限报错
fmt.Println("b= ", b, "c= ", c)
var n1 = 100
fmt.Printf("n1 的类型是 %T \n", n1) // fmt.Printf()可以用于格式化输出
//如何查看某个变量的类型和占用字节数
var n2 int64 = 10
fmt.Printf("n2的类型是 %T,n2的占用字节数是 %d", n2, unsafe.Sizeof(n2))
}
字符型:
默认0 没有专门的字符型,使用byte来保持单个字母字符,不能存汉字(需要3byte),汉字需要用到范围更大的类型,比如int
package main
import (
"fmt"
)
func main() {
var a float32 = 123.334
fmt.Println("a=", a)
//当我们直接输出byte的值,结果是ASCII码值
var c1 byte = 'a'
var c2 byte = '1'
var c3 = '南'
fmt.Println("c1=", c1, "c2=", c2)
fmt.Printf("c1=%c c2=%c c3=%c c3的类型是%T \n", c1, c2, c3, c3)
var c4 int = 22269
fmt.Printf("c4=%c", c4)
//字符实际保存的是一个整数,对应的unicode编码值
}
布尔型:
默认false 只能取true、false,不能用0或非0替代
package main
import (
"fmt"
)
func main() {
var b = false
fmt.Println("b=", b)
fmt.Printf("b类型是%T", b)
//bool只能取true、false,不能用0或非0替代
}
字符串 默认""
一串固定长度的字符连接起来的字符序列,go字符串是由单个字节连接起来,使用utf-8 编码 字符串一旦赋值,就不能修改了 双引号会识别转义 反引号保留原文不识别转义 +可以拼接字符串
package main
import (
"fmt"
_ "os"
)
func main() {
var s1 string = "i am jack"
fmt.Println("s1=", s1)
fmt.Printf("s1类型是%T\n", s1)
// s1[0] = 'a'
fmt.Println("s1[0]=", s1[0])
//反引号中所有符号保留原样
var s2 string = `"i am jack"\n`
fmt.Println("s2=", s2)
var i int = 100
var j float32 = float32(i)
var u uint8 = uint8(j)
fmt.Printf("u=%v,u的类型是%T\n", u, u)
fmt.Printf("i=%v,i的类型是%T", i, i)
//%v原值输出
var n1 int32 = 12
var n2 int64
var n3 int8
// n2 = n1 + 20
n2 = int64(n1) + 20
// n3 = n1 + 20
n3 = int8(n1) + 20
fmt.Println(n1, n2, n3)
// n1是int32,+20也是int32,n2是int64,会报错,n3以此类推
//int64(n1)可以解决问题
}
基本数据类型的转换,需要显式转换T(v)
可以转换不同长度类型,被转换的是变量存储的数据,被转换变量本身的类型没有变化 长转短时,超出部分会按溢出处理
package main
import (
"fmt"
"strconv"
)
func main() {
var num1 int = 99
var num2 float64 = 12.345
var b bool = true
var myChar byte = 'h'
var str string
str = fmt.Sprintf("%d", num1)
fmt.Printf("str type %T str=%v\n", str, str)
str = fmt.Sprintf("%f", num2)
fmt.Printf("str type %T str=%v\n", str, str)
str = fmt.Sprintf("%t", b)
fmt.Printf("str type %T str=%v\n", str, str)
str = fmt.Sprintf("%c", myChar)
fmt.Printf("str type %T str=%v\n", str, str)
var num3 int = 99
var num4 float64 = 23.456
var b2 bool = false
str = strconv.FormatInt(int64(num3), 10)
fmt.Printf("str type %T str=%v\n", str, str)
str = strconv.Itoa(num3 + 999)
fmt.Printf("str type %T str=%v\n", str, str)
str = strconv.FormatFloat(num4, 'f', 10, 64)
fmt.Printf("str type %T str=%v\n", str, str)
str = strconv.FormatBool(b2)
fmt.Printf("str type %T str=%v\n", str, str)
}
基本类型转换为string类型的方法
- fmt.Sprintf("%T",x)
- strconv.FormatInt/FormatFloat/Itoa
- string类型转换为基本数据类型的方法: strconv.ParseInt/ParseFloat/ParseBool
string转基本数据类型注意事项: - 无效值转换,会使用默认值,比如 abc转为int,值为0
package main
import (
"fmt"
"strconv"
)
func main() {
var str1 = "true"
var b1 bool
b1, _ = strconv.ParseBool(str1)
// strconv.ParseBool返回2个值,需要定义2个变量或者使用_匿名函数接收
fmt.Printf("b1 type is %T b1=%v\n", b1, b1)
var str2 string = "12345678"
var i1 int64
i1, _ = strconv.ParseInt(str2, 10, 0)
fmt.Printf("str2 type is %T str2=%v\n", i1, i1)
var str3 string = "123.45678"
var f1 float64
f1, _ = strconv.ParseFloat(str3, 64)
fmt.Printf("f1 type is %T f1=%v\n", f1, f1)
var str4 string = "jack"
var i2 int64 = 11
i2, _ = strconv.ParseInt(str4, 10, 64)
fmt.Printf("i2 type is %T i2=%v", i2, i2)
}