分为两种类型:
1.基本数据类型
数值型:整数类型(有符号:int ; 无符号:uint;注意保小不保大),浮点类型(单精度float32/ 双精度float64 都是有符号的,精度有损失,float64精度比float32高;注意默认为float64 ,一般推荐使用float64, 精度更高)
字符型:byte(Go语言的字符使用UTF-8编码 英文字母-1个字节,汉字-3个字节;在Go中,字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值即:var c1 byte = "a" var c2 int = "北" 可以通过格式化 %c 来输出;
字符型存储到计算机中:utf-8 (unicode码)包含 ascii码
存储:字符--->对应码值---->二进制---->存储
读取:二进制--->码值--->字符---->读取
)
布尔型:bool(只允许取值true和false; 占一个字节)
字符串:string(在go中字符串是不可变的;且可以使用双引号也可以使用反引号,反引号会输出源码)
基本数据类型默认值:
int 0
float32 0
float64 0
bool false
string ""
同基本数据类型转换:
表达式:T(v)将值 v 转换为类型 T
T 就是数据类型 比如:int32 int64 float32等等
v 就是需要转换的变量;
注意:被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化!
var i int8 = 100
var num int32 = int32(i)
// i 找个变量的类型还是 int8 而num的类型为 int32
低精度--->高精度的
基本数据类型 与 string 互转
int -%d float-%f bool-%t byte-%c (具体%后跟什么可以看文档) 转 string
1)fmt.Sprintf() 生成格式化字符串并返回字符串
var num1 int = 99
var str string
str = fmt.Sprintf("%d", num1)
// str type string str==99 ; %q -->可以打印出 "99"
fmt.Printf("str type %T str==%v", str, str)
2) strconv 包里的函数
str = strconv.FormatInt(num1, 10) // 第一个是变量,第二个是十进制
str = strconv.Itoa(num1) // 这个很方便,但是得强转为 int
strconv.FormatFloat() // 参数比较多可以查看文档
strconv.FormatBool() // z只传 bool值的变量即可
string 转 int float bool byte
1)strconv包里的 函数
var str string = "true"
var b bool
// 会返回两个值:第一个是bool值,第二个err值 可以使用 _ 忽略
b, _ = strconv.ParseBool(str)
strconv.ParseInt() // 参数参考文档
strconv.ParseFloat()
注意:无法转成功则会使用默认值 即 0 false 等
2.派生/复杂数据类型()
指针及其内存布局:
1)基本数据类型,变量存的就是值,也叫值类型;
2)获取变量的地址;可以通过 var i int = 10 fmt.Println("i 的地址==", &i) ; 通过 &i 来查看变量i的内存的地址;
3)指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值,比如 var ptr *int = &i ; 那这个ptr就是指针变量;ptr的类型 *int ; ptr的值就是&i(即内存地址)
4)获取指针类型所指向的值,使用* ;比如 var ptr *int ,使用 *ptr 获取ptr指向的值,可以理解先取出ptr的值(内存地址),再根据值(内存地址)取出 值(变量的值)
注意:指针变量类型和变量类型要保持一致
值类型,都有对应的指针类型,形式为:*数据类型 比如int的对应的指针就是 *int ,float32 对应的指针类型就是 *float32 ,依次类推;
值类型包括:基本数据类型int系列,float系列,bool , string, 数组和结构体struct
应用类型:指针,slice切片,map,管道chan,interface等
值类型和应用类型的使用特点:
1)值类型,变量直接存储值,内存通常在栈中分配
2)应用类型,变量存储的是一个地址,这个地址对应的空间才正真存储数据值,内存通常在堆中分配;
数组
结构体
管道
函数
切片
接口
map
后续会补充完整