每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间。
数据类型分为两种,一种是基本数据类型,另一种是派生数据类型,见下图。
简单的说,就是用于存放整数值的,比如0,1,-1,12345等等。
类型 | 有无符号 | 占用存储空间 | 范围 |
---|---|---|---|
int8 | 有 | 1字节 | -128-127 |
int16 | 有 | 2字节 | -2^15 - 2^15-1 |
int32 | 有 | 4字节 | -2^31 - 2^31-1 |
int64 | 有 | 8字节 | -2^63 - 2^63-1 |
int 的无符号类型
类型 | 有无符号 | 占用存储空间 | 范围 |
---|---|---|---|
uint8 | 无 | 1字节 | 0 - 255 |
uint16 | 无 | 2字节 | 0 - 2^16-1 |
uint32 | 无 | 4字节 | 0- 2^32-1 |
uint64 | 无 | 8字节 | 0 - 2^64-1 |
int 的其它类型说明
类型 | 有无符号 | 占用存储空间 | 范围 |
---|---|---|---|
int | 有 | 32位系统4个字节,64位系统8字节 | -2^31 - 2^31-1, -2^63 - 2^63-1 |
unit | 无 | 32位系统4个字节,64位系统8字节 | 0 - 2^32-1 , 0 - 2^64-1 |
rune | 有 | 与int32一样 | -2^31 - 2^31-1 |
byte | 无 | 与unit8一样 | 0 - 255 |
小数类型就是用于存放小数的,比如1.2,6.26等等。
类型 | 占用存储空间 | 范围 |
---|---|---|
单精度float32 | 4字节 | -3.403E38 - 3.403E38 |
双精度float64 | 8字节 | =-1.798E308- 1.798E308 |
说明
package main
import "fmt"
func main(){
var num1 float32 = -100.123456789
var num2 float64 = -100.123456789
fmt.Println("num1 =",num1,"num2 = ",num2)
}
Golang中没有专门的字符类型,如果要存储单个字符,一般使用byte来保存。
字符串就是一串固定长度的字符连续连起来的字符序列。Go的字符串是由单个字节连接起来的。就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成。
package main
import "fmt"
func main() {
var c byte = 'a'
var c1 byte = '0'
//当我们直接输出byte值,就是输出对应的字符的码值
fmt.Println("c = ",c,"c1 =",c1)
//如果我们要输出对应的字符,需要使用格式化输出
fmt.Printf("c=%c c1=%c\n",c,c1)
//var c2 byte = '字'//overflow 溢出
var c3 int = '字'
fmt.Printf("c3=%c c3的码值=%d",c3,c3)
}
package main
import "fmt"
import "unsafe"
func main() {
var b = false
fmt.Println("b=",b)
fmt.Println("b的占用空间 =",unsafe.Sizeof(b))
}
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串使用UTF-8编码标识Unicode文本。
package main
import "fmt"
func main() {
var name string = "Casey"
fmt.Println(name)
}
package main
import "fmt"
func main() {
var name string = "Casey"
name[0] = 'c'
fmt.Println(name)
}
func main() {
var name string = "Casey"
name += "Casey"
fmt.Println(name)
}
package main
import "fmt"
func main() {
//分行写,将+保留在上一行
name := "Casey" + "hello world!hello world!hello world!"+
"hello world!"
fmt.Println(name)
}
在go中,数据类型都有一个默认值,当没有赋值时,就会保留默认值,在go中默认值又叫零值。
数据类型 | 默认值 |
---|---|
整型 | 0 |
浮点型 | 0 |
字符串 | “” |
布尔类型 | false |
Golang和java/c不同,Go在不同的变量之间赋值时需要显示转换。也就是说Golang中数据类型不能自动转换。
案例:
package main
import (
"fmt"
)
func main() {
var i int32 = 100
//将i转换成float
var n1 float32 = float32(i)
var n2 int8 = int8(i)//高到低
var n3 int64 = int64(i) //低到高
fmt.Printf("i = %v,n1 = %v, n2 = %v, n3 = %v\n",i,n1,n2,n3)
}
运行结果:
注:
在go中,数据类型的转换可以从表示范围小到表示范围大,也可以 范围大到范围小。在转换中国,比如将int64 转成 int8,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。因此在转换时,需要考虑范围。
方式1:fmt.Sprintf("%参数",表达式)
Sprintf根据format参数生成格式化的字符串并返回该字符串。
方式2:使用strconv包的函数
代码:
package main
import (
"fmt"
"strconv"
)
func main() {
var num1 int = 99
var num2 float64 = 3.14
var b bool = true
var myChar byte = 'h'
var str string
//方式1,使用fmt.Sprintf
str = fmt.Sprintf("%d",num1);
fmt.Printf("str type %T,str = %q\n",str,str)
str = fmt.Sprintf("%f",num2);
fmt.Printf("str type %T,str = %q\n",str,str)
str = fmt.Sprintf("%t",b);
fmt.Printf("str type %T,str = %q\n",str,str)
str = fmt.Sprintf("%c",myChar);
fmt.Printf("str type %T,str = %q\n",str,str)
//第二种方式 strconv函数
str = strconv.FormatInt(int64(num1),10)
fmt.Printf("str type %T,str = %q\n",str,str)
//说明:'f'格式,10表示小数保留10位,64表示这个小数是float64
str = strconv.FormatFloat(num2,'f',10,64)
fmt.Printf("str type %T,str = %q\n",str,str)
str = strconv.FormatBool(b)
fmt.Printf("str type %T,str = %q\n",str,str)
}
使用strconv包的函数
案例:
package main
import (
"fmt"
"strconv"
)
func main() {
var num1 int64
var num2 float64
var b bool
var str string = "true"
//说明:strconv.ParseBool(str)函数会返回两个值(value bool,err error)
//我们只想获取到value bool,不想获取err,所以用_忽略
b , _ = strconv.ParseBool(str)
fmt.Printf("b type %T, b = %v\n",b,b)
var str1 = "123"
num1 , _ = strconv.ParseInt(str1,10,64)
fmt.Printf("num1 type %T, num1 = %v\n",num1,num1)
var str2 = "3.1415"
num2 , _ = strconv.ParseFloat(str2,64)
fmt.Printf("num2 type %T, num2 = %v\n",num2,num2)
}
运行结果:
注:在将string类型转成基本数据类型是,要确保string类型能够转成有效的数据。想要了解更多,可参考go语言中文文档。