基本数据类型,变量存的就是值,也叫值类型
每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间
image.png

Printf 和 Println 的区别

  • printf 输出后不换行, println输出后自动换行;
  • printf格式化输出,println 直接输出内容
  • Printf根据format参数生成格式化的字符串并写入标准输出。

    判断数据类型以及查看变量使用内存空间

    ```go package main

// import “unsafe” // import “fmt” // 引入多个 import ( “fmt” “unsafe” )

func main() { var i int8 = 12 fmt.Println(“i= “, i)

  1. var i2 uint8 = 129
  2. fmt.Println("i2= ", i2)
  3. var n = 12
  4. fmt.Printf("n的类型是%T\n", n) // n的类型是int
  5. var name = "xiao"
  6. fmt.Printf("name的类型是%T\n", name) // name的类型是string
  7. // 查看变量占用的字节大小和数据类型
  8. fmt.Printf("name的类型是%T", name, unsafe.Sizeof(name))

}

  1. <a name="SbJ77"></a>
  2. # 基本数据类型
  3. <a name="mrrMG"></a>
  4. ## 数值型
  5. <a name="VlqFR"></a>
  6. ### 整数类型 (默认值是0)
  7. int, int8, int16, int32, int64<br />uint, uint8, uint16, uint32, uint64 无符号数(表示的范围更大)<br />byte
  8. > bit: 计算机中的最小存储单位
  9. > byte: 计算机中基本存储单元
  10. > 1byte = 8bit (一个字节8位)
  11. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2932776/1635419026055-9b5e6bb6-1286-4a7f-b12a-f1dec4841493.png#clientId=u324eaf3f-5517-4&from=paste&id=u666d2d62&margin=%5Bobject%20Object%5D&name=image.png&originHeight=255&originWidth=1004&originalType=binary&ratio=1&size=156543&status=done&style=none&taskId=u59c47202-7289-43e3-9828-fe650f26392)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2932776/1635418985823-269f2320-e4bc-45c5-ad3d-f87fb30778aa.png#clientId=u324eaf3f-5517-4&from=paste&id=u8f5550f1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=209&originWidth=811&originalType=binary&ratio=1&size=111234&status=done&style=none&taskId=u506f841c-8626-4c30-9fbb-6de2ca3a245)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2932776/1635419782913-fb6bb706-9c7a-4c59-8ce9-7c84c7d68774.png#clientId=u324eaf3f-5517-4&from=paste&id=u9f44a547&margin=%5Bobject%20Object%5D&name=image.png&originHeight=257&originWidth=696&originalType=binary&ratio=1&size=116310&status=done&style=none&taskId=uc7935c75-ece5-43ae-bd80-47f716b1ee1)
  12. ```go
  13. var i int8 = -129
  14. // constant -129 overflows int8
  15. var i2 uint8 = -129
  16. // constant -129 overflows uint8

浮点类型 (默认值是0)

float32
float64(默认类型)
image.png
浮点数 = 符号位 + 指数位 + 尾数位
浮点数都是有符号的
使用浮点类型的时候就需要注意存在丢失精度的问题

  1. var num1 float32 = 12.556883123132 // 精度会丢失
  2. var num2 float64 = 12.556883123132 // 64位比32位精度要准确
  3. fmt.Println("num1=", num1, "num2", num2) // num1= 12.556883 num2 12.556883123132
  4. var num = 12.64
  5. fmt.Printf("num的类型", num) // num的类型%!(EXTRA float64=12.64)
  6. var num3 = 5.6e2 // 5.6 * 10^2 = 5.6 * 100 = 560
  7. fmt.Println("num3=", num3)

字符型

没有专门的字符型,使用byte来保存单个字母字符
ASCII码(128个)

  • Go语言的字符使用UTF-8编码
  • 英文字母:1个字节
  • 汉字:3个字节
  • 字符必须使用单引号括起来,双引号会报错

单引号针对单个字符,字符串要使用双引号
UTF-8是对ASCII的扩容

  1. var str1 byte = 'a'
  2. var str2 byte = '0'
  3. // 当直接输出byte时,输出的使对应字符的ASCII码值(十进制)
  4. fmt.Println("str1", str1, "str2", str2) // str1 97 str2 48
  5. fmt.Printf("str1=%c str2=%c", str1, str2) // str1=a str2=0
  6. fmt.Printf("str1=%c", str1) // str1=a
  7. fmt.Printf("str2=%c", str2) // str2=0
  8. var name byte = '吖'
  9. fmt.Printf("name=%c", name) // overflows byte 超出byte类型的存储范围了
  10. // 汉字更换成int类型
  11. var name int = '吖'
  12. fmt.Printf("name=%c", name) // name=吖
  13. var name1 int =22269
  14. fmt.Printf("name1=%c", name1) // name1=国
  15. // 数据类型只是为了定义存储空间的大小,对应计算机中的内存空间

基本数据类型 - 图3
image.png

布尔型(bool)(默认值是false)

用于逻辑运算,流程控制
boo类型只占用一个字节的内存空间

  1. var a = false
  2. fmt.Println(a) // false
  3. fmt.Println(unsafe.Sizeof(a)) // 1

字符串(string)(默认值是””)

UTF-8编码
字符串一经定义,则不能修改

  1. var address string = "北京长城"
  2. fmt.Println(address) // 北京长城
  3. var str = "hello"
  4. str[0] = 'a' // cannot assign to str[0] (strings are immutable)
  5. fmt.Println(str)
  6. // 反引号
  7. // 以字符串原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
  8. // 字符串拼接, + 号要放在上面,否则会报错(因为go默认在一行后面加;号)
  9. var str01 = "hello" + " world"
  10. str01 += " haha!" + "xixi" +
  11. "heihei"
  12. fmt.Println(str01) // hello world haha!xixiheihei

基本数据类型的默认值

  1. var a int
  2. var b float32
  3. var c float64
  4. var d bool
  5. var e string
  6. // %v表示按照变量的值输出
  7. fmt.Printf("a=%d,b=%v,c=%v,d=%v e=%v", a,b,c,d,e) // a=0,b=0,c=0,d=false e=

派生/复杂数据类型

1、指针(Pointer)
2、数组
3、结构体(struct)
4、管道(Channel)
5、函数
6、切片(slice)
7、接口(interface)
8、map