每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间。
数据类型分为两种,一种是基本数据类型,另一种是派生数据类型,见下图。
基本介绍
简单的说,就是用于存放整数值的,比如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 |
整型的使用细节
- Golang各整数类型分:有符号和无符号,int, unit的大小和系统有关。
- Golang的整型默认声明为int型。
- Golang程序中整型变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型。
- bit:计算机中的最小存储单位,byte:计算机中国基本存储单元。 1byte = 8 bit
基本介绍
小数类型就是用于存放小数的,比如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浮点类型有固定的范围和字段长度,不受具体OS的影响
- Golang的浮点型默认声明为float64类型
- 通常情况下,应该使用float64,因为float64的精度比float32要准确。
基本介绍
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)
}
输出结果:
说明
- 如果我们保存的字符在ASCII表的,比如0到9,a-z等,直接可以保存到byte
- 如果我们保存的字符对应码值大于255,这是我们可以考虑int类型来保存
- 如果我们需要按字符的方式输出,这是我们需要格式化输出,即fmt.Printf
字符类型使用细节
- 字符常量是用单引号‘’括起来的单个字符,例如var c byte = ‘a’,var c1 int = '中’
- Go中允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。例如var c char = '\n’表示换行
- Go语言的字符使用UTF-8编码(英文字母1个字节,汉子3个字节)
- 在Go中,字符的本质是一个整数,直接输出是,是该字符对应的UTF-8编码的码值
- 字符类型是可以进行运算的,相当于一个整数,因为它都是Unicode码
基本介绍
- 布尔累次那个也叫bool类型,bool类型数据值允许取值true和false
- bool 类型占1个字节
- bool类型适于逻辑运算,一般用于程序流程控制
案例
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)
}
运行结果:
string使用注意事项
- Go语言的字符串的字节使用UTF-8编码标识,Unicode文本,这样Golang统一使用UTF-8编码,中文乱码问题不会再困扰程序员。
- 字符串一旦复制了,字符串就不能修改了,在Go中字符串是不可以变的。
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,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。因此在转换时,需要考虑范围。
基本类型转string类型
方式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)
}
运行结果:
string类型转基本数据类型
使用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语言中文文档。