golang基本数据类型
1.整形
- 默认整数类型为int
- 变量在选择时应遵循最小化原则
1.1 有符号(int)
类型 | 取值范围 | 占用空间(字节) |
---|---|---|
int8 | -2^7到 2^7-1 (-128到127) | 1 |
int16 | -2^15到 2^15-1 (-32768到32767) | 2 |
int32 | -2^31到 2^31-1(-2147483648到2147483647) | 4 |
int64 | -2^63到 2^63-1 (-9223372036854775808到9223372036854775807) | 8 |
package main
import (
"fmt"
"unsafe"
)
func main() {
var a int8 = -10 //定义变量a为int8类型,值为-10
fmt.Printf("a的类型为:%T\n", a) //打印变量类型
fmt.Println("占用字节数为:", unsafe.Sizeof(a)) //打印占用字节数
}
输出结果
a的类型为:int8
占用字节数为: 1
1.2 无符号(unit)
类型 | 取值范围 | 占用空间(字节) |
---|---|---|
uint8 | 0到2^8-1(0到255) | 1 |
uint16 | 0到2^16-1(0到65535) | 2 |
uint32 | 0到2^32-1(0到4294967295) | 4 |
uint64 | 0到2^64-1(0到18446744073709551615) | 8 |
package main
import "fmt"
func main() {
var a uint8 = 256 //定义变量a为uint8类型,值为257
fmt.Println(a) //打印a的值
}
输出结果
因为unit8的取值为0-255,a的值大于了255,所以报错溢出。
cannot use 256 (untyped int constant) as uint8 value in variable declaration (overflows)
1.3 其他整数类型
int:在32位操作系统等于int32,在64位操作系统等于int64
uint:在32位操作系统等于uint32,在64位操作系统等于uint64
rune:等于int32
byte:等于uint8
类型 | 取值范围 | 占用空间(字节) |
---|---|---|
int | 32位:-2^31到 2^31-1(-2147483648到2147483647) | 4 |
int | 64位:-2^63到 2^63-1 (-9223372036854775808到9223372036854775807) | 8 |
uint | 32位:0到2^32-1(0到4294967295) | 4 |
uint | 64位:0到2^64-1(0到18446744073709551615) | 8 |
rune | -2^31到 2^31-1(-2147483648到2147483647) | 4 |
byte | 0到2^8-1(0到255) | 1 |
2.浮点型
float默认为float64。
float64比float32更精准。
类型 | 取值范围 | 占用空间(字节) |
---|---|---|
float32 | -3.4e38到3.4e38 | 4 |
float64 | -1.8e308到1.8e308 | 8 |
package main
import "fmt"
func main() {
a := 0.5 //定义a为浮点数
fmt.Printf("a的类型为:%T\n", a) //输出a的数据类型
var b float32 = 1.00000002 //定义b为float32
fmt.Println("b的值为:", b) //输出变量b的值
var c float64 = 1.00000002 //定义b为float64
fmt.Println("c的值为:", c) //输出变量b的值
}
输出结果
a的类型为:float64
b的值为: 1
c的值为: 1.00000002
3.布尔类型
bool的值只有true和false
bool占用空间为1字节
boot一般用于流程判断
package main
import "fmt"
func main() {
var f1 bool = 3 > 3
fmt.Println(f1)
var f2 bool = true
fmt.Printf("f2的类型为:%T", f2)
}
输出结果
false
f2的类型为:bool
4.字符类型
- golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存。
- byte类型保存的范围为0-255,超过255的范围用int表示。
- byte类型默认输出为ASCII的码值。
- int类型默认输出的为Unicode的码值。
- 想显示对应的字符内容,必须采用格式化输出。
4.1 数字,字母,符号
package main
import "fmt"
func main() {
var c1 byte = '9' //输出为57
var c2 byte = 'e' //输出为101
var c3 byte = '{' //输出为123
fmt.Println(c1, c2, c3) //默认输出的为
}
输出结果
57 101 123
输出结果对照ASCII码表的码值。
4.2 汉字
package main
import "fmt"
func main() {
//var c4 byte = '李' //输出报错:cannot use '李' (untyped rune constant 26446) as byte value in variable declaration (overflows)
//fmt.Println(c4) //汉字‘李’,对应的码值为26446,byte类型只能表示0-255的码值,所以报错溢出。
var c4 int = '李' //将byte类型改为int类型
fmt.Println(c4) //输出26446
fmt.Printf("c4的值为:%c", c4) //格式化输出c4的值
}
输出结果
26446
c4的值为:李
查询UTF-8编码表:
http://www.mytju.com/classcode/tools/encode_utf8.asp
4.3 转义字符
使用转义字符’\’来将其后的字符转变为特殊字符。
符号 | 含义 |
---|---|
\t | 制表符(默认8个字符一个制表符) |
\n | 换行 |
\b | 退格 |
\r | 光标制动到最前面,然后替换后面的值 |
\ | 转义后面的符号 |
package main
import "fmt"
func main() {
fmt.Println("012345\t6789") //输出结果为”012345 6789“,5后面有2个空格,补齐8位
fmt.Println("012345\n6789")
/*
输出结果为
012345
6789
*/
fmt.Println("012345\b6789") //输出结果为012346789,在5的时候退格,从6开始替换。
fmt.Println("0123\r456789") //输出结果为456789,在3的时候光标自动到0,从4开始替换。
fmt.Println("012345\"67889") //输出结果为012345"67889,中间的“转义成常量输出。
}
输出结果
012345 6789
012345
6789
012346789
456789
012345"67889
5. 字符串类型
- 字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节链接起来的。
- Go语言的字符串的字节使用utf-8编码标识Unicode文本。
- 字符串一旦赋值了,其中的字符就不能修改了。在Go中字符串是不可变的。
5.1 字符串输出形式
package main
import "fmt"
func main() {
// 没有特殊符号,直接输出。
var s1 string = "li"
fmt.Println("s1的值为:", s1)
//有特殊符号
//(1) 转义符\转义特殊符号输出。
var s2 string = "li\"xin"
fmt.Println("s2的值为:", s2)
//(2)反引号`,直接输出反引号中的内容。
var s3 string = `li"xin"`
fmt.Println("s3的值为:", s3)
}
输出结果
s1的值为: li
s2的值为: li"xin
s3的值为: li"xin"
5.2 字符串拼接
package main
import "fmt"
func main() {
//(1)少量字符串拼接
var s4 string = "li" + "xin"
fmt.Println("s4的值为:", s4)
//(2)大量字符串拼接,拼接换行的时候+得留在最后
var s5 string = "li" + "xin" +
"yu"
fmt.Println("s5的值为:", s5)
}
输出结果
s4的值为: lixin
s5的值为: lixinyu
6.数据类型默认值
类型 | 默认值 |
---|---|
整数 | 0 |
浮点数 | 0 |
字符串 | "" |
布尔 | flase |
package main
import "fmt"
func main() {
var a int //定义一个整数类型a
fmt.Println("整型a的默认值为: ", a)
var b float32 //定义一个浮点类型b
var c float64 //定义一个浮点类型c
fmt.Println("浮点类型b的默认值为: ", b)
fmt.Println("浮点类型c的默认值为: ", c)
var d bool //定义一个布尔类型d
fmt.Println("布尔型d的默认值为: ", d)
var e string //定义一个字符串类型e
fmt.Println("字符串类型e的默认值为:", e)
}
输出结果
整型a的默认值为: 0
浮点类型b的默认值为: 0
浮点类型c的默认值为: 0
布尔型d的默认值为: false
字符串类型e的默认值为:
7.数据类型转换
- golang中不存在隐式类型转换,所有类型转换都必须显式的声明。
- 类型转换语法。
表达式T(v)将值v转换为类型T。
T : 就是数据类型。
v : 就是需要转换的变量。
7.1 基本数据类型转换
package main
import "fmt"
func main() {
var n1 int64 = 128 //定义n1变量为int64类型
var n2 int32 = int32(n1) //将int64转为int32
fmt.Println("n2的值为: ", n2)
//n1的类型还是int64没变,只是将n1的值转为了int32
fmt.Printf("n1的类型为:%T\n", n1)
fmt.Printf("n2的类型为:%T\n", n2)
//将int64转为int8
var n3 int64 = 200 //定义变量n3的类型为int64,值为200
var n4 int8 = int8(n3) //将n3的值转为int8,赋值给n4
fmt.Println("n4的值为:", n4) //由于int8的取值范围为-128到127,200大于int8的取值范围,所以虽然编译不会报错,但是数据会溢出
var n5 int32 = 20 //定义变量n5的类型为int32
var n6 int64 = int64(n5) + 20 //定义n6的类型为int64,将n5的值先转为int64,然后执行相加操作
fmt.Println("n6的值为: ", n6)
var n7 int64 = 20 //定义变量n5的类型为int64
var n8 int8 = int8(n7) + 127 //定义n8的类型为int8,将n7的值先转为int8,然后执行相加操作
fmt.Println("n8的值为: ", n8) //编译不会报错,但是20+127=147超过了int8的取值范围,所以数据会溢出
//var n9 int8 = int8(n7) + 128 //定义n9的类型为int8,将n7的值先转为int8,然后执行相加操作
//fmt.Println("n9的值为: ", n9) //编译报错“128 (untyped int constant) overflows int8”,因为128已经大于了int8的取值范围。
}
输出结果
n2的值为: 128
n1的类型为:int64
n2的类型为:int32
n4的值为: -56
n6的值为: 40
n8的值为: -109
7.2 基本数据类型转为字符串类型
go语言标准库:https://studygolang.com/pkgdoc
7.2.1 fmt.Sprintf("%参数",表达式)方式
package main
import "fmt"
func main() {
//整形转为字符串类型
var n1 int = 10
var s1 string = fmt.Sprintf("%d", n1) //%d表示为十进制
fmt.Printf("s1的类型为%T,s1的值为%q\n", s1, s1) //%T值的类型,%q,%t都为输出对应的值,但是%q会用双引号引起来。
//浮点型转为字符串类型
var n2 float32 = 1.1
var s2 string = fmt.Sprintf("%f", n2) //%f表示有小数部分但无指数部分
fmt.Printf("s2的类型为%T,s2的值为%q\n", s2, s2)
//布尔转字符串类型
var n3 bool = true
var s3 string = fmt.Sprintf("%t", n3) //%t表示单词true或false
fmt.Printf("s3的类型为%T,s3的值为%q\n", s3, s3)
//字符类型转字符串
var n4 byte = '{'
var s4 string = fmt.Sprintf("%c", n4) //%c表示该值对应的unicode码值
fmt.Printf("s4的类型为%T,s4的值为%q\n", s4, s4)
}
输出结果
s1的类型为string,s1的值为"10"
s2的类型为string,s2的值为"1.100000"
s3的类型为string,s3的值为"true"
s4的类型为string,s4的值为"{"
7.2.2 strconv包的函数
- func FormatBool(b bool) string (将bool转为string)
- func FormatInt(i int64, base int) string (将int转为string)
- func FormatUint(i uint64, base int) string (将uint转为string)
- func FormatFloat(f float64, fmt byte, prec, bitSize int) string (将float转为string)
package main
import (
"fmt"
"strconv"
)
func main() {
//整形转为字符串类型
var n1 int = 100
//strconv.FormatInt需要传两个参数
//第一个参数需要是int64类型的,所以需要转一下
//第二个参数为需要转为什么进制的,取值为2-36
var s1 string = strconv.FormatInt(int64(n1), 10)
fmt.Printf("s1的类型为%T,s1的值为%q\n", s1, s1)
//浮点型转为字符串类型
var n2 float32 = 12.34
//strconv.FormatFloat需要传两个参数
//第一个参数需要是float64类型的,所以需要转一下
/*
第二个参数:
'f'(-ddd.dddd,十进制)
'b'(-ddddp±ddd,指数为二进制)
'e'(-d.dddde±dd,十进制指数)
'E'(-d.ddddE±dd,十进制指数)
'g'(指数很大时用'e'格式,否则'f'格式)
'G'(指数很大时用'E'格式,否则'f'格式)
*/
//第三个参数为保留的小数位
//第四个参数为浮点型变量类型,64表示float64,32表示float32
var s2 string = strconv.FormatFloat(float64(n2), 'f', 4, 64)
fmt.Printf("s2的类型为%T,s2的值为%q\n", s2, s2)
//bool转为字符串类型
var n3 bool = true
var s3 string = strconv.FormatBool(n3)
fmt.Printf("s3的类型为%T,s3的值为%q\n", s3, s3)
}
输出结果
s1的类型为string,s1的值为"100"
s2的类型为string,s2的值为"12.3400"
s3的类型为string,s3的值为"true"
7.3 字符串类型转为基本数据类型
- func ParseBool(str string) (value bool, err error) (将字符串转为bool类型)
- func ParseInt(s string, base int, bitSize int) (i int64, err error) (将字符串转为int类型)
- func ParseUint(s string, base int, bitSize int) (n uint64, err error) (将字符串转为unit类型)
- func ParseFloat(s string, bitSize int) (f float64, err error) (将字符串转为float类型)
package main
import (
"fmt"
"strconv"
)
func main() {
//字符串类型转整形
var s1 string = "10"
//第一个参数为字符串
//第二个参数为需要转成的进制,取值为2-36
//第三个参数表示结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64
var n1 int64
//ParseInt这个函数的返回值有两个:(i int64, err error)
//i为转换的整形,err为转换的报错。
//使用下划线(_),忽略err的报错。
n1, _ = strconv.ParseInt(s1, 10, 64)
fmt.Printf("n1的类型为:%T,n1的值为:%v \n", n1, n1)
//字符串类型转bool
var s2 string = "true"
var n2 bool
n2, _ = strconv.ParseBool(s2)
fmt.Printf("n2的类型为:%T,n2的值为:%v \n", n2, n2)
//字符串类型转浮点型
var s3 string = "123.456"
var n3 float64
//第一个参数为字符串
//第二个参数为64是float64,32是float32(返回值可以不改变精确值的赋值给float32)。
n3, _ = strconv.ParseFloat(s3, 64)
fmt.Printf("n3的类型为:%T,n3的值为:%v \n", n3, n3)
//string类型转为非有效数据类型
var n4 string = "test"
var b1 bool
b1, _ = strconv.ParseBool(n4) //因为n4的值为test,非true或false,所以b1输出的为默认值false
fmt.Printf("b1的类型为:%T,b1的值为:%v \n", b1, b1)
var num1 int64
num1, _ = strconv.ParseInt(n4, 10, 64) //因为n4的值为test,非整形,所以num1输出的为默认值0
fmt.Printf("num1的类型为:%T,num1的值为:%v \n", num1, num1)
var f1 float64
f1, _ = strconv.ParseFloat(n4, 64) //因为n4的值为test,非浮点型,所以f1输出的为默认值0
fmt.Printf("f1的类型为:%T,f1的值为:%v \n", f1, f1)
}
输出结果
n1的类型为:int64,n1的值为:10
n2的类型为:bool,n2的值为:true
n3的类型为:float64,n3的值为:123.456
b1的类型为:bool,b1的值为:false
num1的类型为:int64,num1的值为:0
f1的类型为:float64,f1的值为:0