Go语言基本数据类型1
分类 | 类型 | 细分类型 | 数据类型 | 数值 |
---|---|---|---|---|
基本数据类型 | 数值型 | 整数类型 | int | 32位系统4个字节 -231 ~ 231-1 | 64位系统8个字节 -263-1 ~ 263-1 | 整型的默认类型是int |
int8 | -128 ~ 127 | |||
int16 | -215 ~ 215-1 | |||
int32 / rune | -231 ~ 231-1 rune表示一个unicode码 | |||
int64 | -263 ~ 263-1 | |||
uint | 32位系统4个字节 0 ~ 232-1 | 64位系统8个字节 0 ~ 264-1 | |||
uint8 / byte | 0 ~ 255 | |||
uint16 | 0 ~ 215-1 | |||
uint32 | 0 ~ 231-1 | |||
uint64 | 0 ~ 263-1 | |||
byte | 0 ~ 255 | |||
浮点型 | float32 | -3.403E38 ~ 3.403e38 | 符号位 + 指数位 + 尾数位 | ||
float64 | -1.798E308 ~ 1.798E308 | 默认是float64 | |||
字符型 | 字符型 | byte | 0 ~ 255 | |
布尔型 | 布尔型 | bool | true、false | |
字符串 | 字符串 | string | - |
数据类型 | 细分类型 | 表示 |
---|---|---|
派生/复杂数据类型 | 指针 | pointer |
数组 | - | |
结构体 | struct | |
管道 | channel | |
函数 | - | |
切片 | slice | |
接口 | interface | |
map | - |
一、整型的使用细节
- go中各整数类型分:有符号 和 无符号 ,int uint 的大小关系和系统有关
- go中的整型more声明为int型
- 如何在程序中查看某个变量的字节大小和数据类型
package main
import (
"fmt"
"unsafe"
)
func main(){
var n1 int64 10
fmt.Printf("n1 的类型为 %T n1占用的字节数为 %d ", n1, unsafe.Sizeof(n1) )
}
- go程序中整型变量在使用中时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型。如
var age byte = 90
- bit: 计算机中的最小存储单位。byte:计算机中基本存储单元。
二、小数类型/浮点型
类型 | 占用存储空间 | 表数范围 |
---|---|---|
单精度float32 | 4字节 | -3.403E38 ~ 3.403e38 |
双精度float64 | 8字节 | -1.798E308 ~ 1.798E308 |
-
类型分类
-
关于浮点数在机器中的存放形式的简单说明,浮点数=符号位+指数位+尾数位
浮点数都是有符号的
-
尾数部分可能丢失,造成精度损失
-
-
浮点型使用细节
- go浮点类型有固定的范围和字段长度,不受操作系统影响
- go的浮点型默认声明为float64类型
- 浮点常亮有两种表现形式
- 十进制数形式:5.12 或 .512 (必须有小数点)
- 科学计数法形式:5.123e2 = 5.12 *10的2次方 或 5.12E-2 = 5.12 / 10的2次方
三、字符类型
-
基本介绍
go中没有专门的字符类型,如果要存储单个字符(字母),一般用byte来保存
字符串就是一串固定长度的字符链接起来的字符序列, go的字符串是由字节组成的
var n1 byte = 'a'
var n2 byte = 'b'
var n3 int = '冬'
-
使用细节
- 字符常量是用单引号括起来的单个字符
- \ 是转义字符
- go语言的字符使用utf-8编码,英文字母1个字节,汉字3个字节
- 在go中,字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值,码值查询
- ASCII表中的字符,可以直接保存到byte
- 字符对应码值大于255时,考虑用int类型保存
- 字符类型是可以进行运算的,相当于一个整数,因为他都有对应的unicode码
-
字符类型本质探讨
-
字符型 存储到计算机中,需要价格字符对应的码值(整数)找出来
存储:字符—>对应码值—>二进制—>存储
读取:二进制—>码值—>字符—>读取
-
字符和码值的对应关系是通过字符编码表决定的(是规定好的)
-
go语言的编码都同一成utf-8,非常方便,很统一,再也没有编码乱码的困扰
-
四、布尔类型
- 基本介绍
- bool类型数据只允许取值 true 或false
- bool类型占用1个字节
- bool类型适用于逻辑运算,一般用于程序流程控制
五、string类型
-
基本介绍
字符串就是一串固定长度的字符连接起来的字符序列。go中的字符串是由单个字节连接起来的。
-
字符串一旦赋值了,就不能修改了。在go中字符串是不可变的。
-
字符串的两种表示形式
- 双引号,会识别转义字符
- 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止共计、输出源代码等效果
-
字符串拼接
var str = "hello" + "world"
str += "haha!"
- 当一行字符串太长时,需要用到多行字符串,可以如下处理
str4 := "hello" + "world" + "..." +
"abc" + "bcd" + "cde" +
"efg"
六、基本数据类型的互相转换
- go语言中,不同类型的变量之间赋值时需要显式转换,不能自动转换
- 基本语法
- T(v) , 将 值v 转换为类型T
- 注意事项
- 转换类型时,需要考虑范围,转换时不报错但是数据会溢出处理
七、基本数据类型与string的转换
package main
import (
"fmt"
"strconv"
)
func main(){
var v1 int = 10
var v2 float64 = 12.3456
var b bool = false
var cchar byte = 'v'
var n1 int64 = 100
var n2 float64 = 23.456
var name bool = true
// 方式一:fmt转换方法
// fmt. Sprintf(format string, a ...interface{}) string
// 实例
str4 := fmt.Sprintf("%d", v1)
fmt.Printf("str4 type %T str=%q\n" ,str4, str4)
str5 := fmt.Sprintf("%f", v2)
fmt.Printf("str5 type %T str=%q\n" ,str5, str5)
str6 := fmt.Sprintf("%t", b)
fmt.Printf("str6 type %T str=%q\n" ,str6, str6)
str7 := fmt.Sprintf("%c", cchar)
fmt.Printf("str7 type %T str=%q\n" ,str7, str7)
// 方式二:strconv包方法
str := strconv.FormatInt(n1,10)
fmt.Printf("str type %T str=%q\n",str,str)
str2 := strconv.FormatFloat(n2, 'f', 10, 64)
fmt.Printf("str2 type %T str=%q\n",str2,str2)
str3 := strconv.FormatBool(name)
fmt.Printf("str3 type %T str=%q\n",str3,str3)
var nums int64 = 4567
str8 := strconv.Itoa(int(nums))
fmt.Printf("str8 typr %T str=%q\n",str8,str8)
}
package main
import (
"fmt"
"strconv"
)
// string类型转基本数据类型
func main() {
var str string = "true"
var b bool
b, _ = strconv.ParseBool(str)
fmt.Printf("b type %T b=%v\n",b,b)
var str2 string = "123456789"
var n1 int64
var n2 int
n1, _ = strconv.ParseInt(str2, 10, 64)
n2 = int(n1)
fmt.Printf("n1 type %T n1=%v\n",n1,n1)
fmt.Printf("n2 type %T n2=%v\n",n2,n2)
var str3 string = "123.456"
var f1 float64
f1, _ = strconv.ParseFloat(str3,64)
fmt.Printf("n1 type %T f1=%v\n",f1,f1)
}
八、指针
- 基本介绍
- 基本数据类型,变量存的就是值,也叫值类型
- 获取变量地址,用&,比如:var num int ,获取num的地址:&num
- 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值
- 获取这阵类型所指向的值 var ptr *int,使用***ptr**获取ptr所指向的值
package main
import (
"fmt"
)
func main(){
var num int = 9
fmt.Printf("num address= %v\n", &num)
// 声明指针变量
var ptr *int
// 对指针进行赋值
ptr = &num
// 通过指针修改指向的值
*ptr = 10
fmt.Printf("num = %v\n", num)
}
- 指针的使用细节
- 值类型,都有对应的指针类型,形式为 *数据类型 如 int 指针类型为 *int
- 值类型包括:基本数据类型 int系列,float系列,bool,string,数组 和 结构体 struct
九、值类型和指针类型
- 说明
- 值类型:基本数据类型 int系列,float系列,bool,string,数组 和 结构体 struct
- 引用类型:指针,slice切片,map,管道channel,interface都是引用类型
- 值类型和指针类型的特点
- 值类型:变量直接存储值,内存通常在栈中分配
- 引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,改地址对应的数据空间就变成为一个垃圾,由GC回收