作用

告诉编译器这个数据(变量)应该以多大内存空间存储

关于类型

  • 编译器要求:每个值必须在经过编译后属于某个类型(因为go是静态类型语言)
  • 自定义类型:新类型不会拥有原基础类型所附带的方法(新的类型,方法需要重新创建)

数据类型 - 图1

基础类型

image.png

详情

类型 名称 长度 零值 说明
bool 布尔类型 1 false 其值不为真即为家,不可以用数字代表true或false
byte 字节型 1 0 uint8别名
rune 字符类型 4 0 专用于存储unicode编码,等价于uint32
int, uint 整型 4或8 0 32位或64位
int8, uint8 整型 1 0 -128 ~ 127, 0 ~ 255
int16, uint16 整型 2 0 -32768 ~ 32767, 0 ~ 65535
int32, uint32 整型 4 0 -21亿 ~ 21 亿, 0 ~ 42 亿
int64, uint64 整型 8 0
float32 浮点型 4 0.0 小数位精确到7位
float64 浮点型 8 0.0 小数位精确到15位
complex64 复数类型 8
complex128 复数类型 16
uintptr 整型 4或8 ⾜以存储指针的uint32或uint64整数
string 字符串 “” utf-8字符串,注意字符串的零值是 “”

unicode 编码集(规定了字符的数字编码) UTF8 为 unicode 的具体实现方案之一(规定了数字编码的实际存储方案)

bool

bool只有两个值,

  • true
  • false

注意: 整形无法做类型转换,成为 bool

  1. package main
  2. import "fmt"
  3. func main() {
  4. c := bool(1)
  5. fmt.Println("c := ", c)
  6. }

输出

  1. D:\projects\gocode\go100\breakdemo
  2. λ go run main.go
  3. # command-line-arguments
  4. .\main.go:7:11: cannot convert 1 (type untyped int) to type bool

字符串

字符串就是一串固定长度的字符连接起来的字符序列。 go的字符串是由单个字节连接起来的。go语言的字符串的字节是使用 utf8 编码的 unicode文本

  • 使用双引号
  • 字符串可以有一个或者多个字符组成
  • 字符串都是隐藏了一个结束符 \0
  • 支持原字符

image.png
x4F60 x597D , x4E16 x754C;
编码参考 unicode utf8 ascii https://www.zhihu.com/question/23374078

  1. func main() {
  2. str := "你好,世界" // 你好,世界
  3. fmt.Printf("str len is: %d\n", len(str))
  4. }
  5. // str len is: 13

utf8编码介绍
数据类型 - 图4

utf8编码规则
根据上表,解读 UTF-8 编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

下面,还是以汉字为例,演示如何实现 UTF-8 编码。
的 Unicode 是4E25100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800 - 0000 FFFF),因此的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从的最右边二进制位开始,依次从右往左填入上边格式中的x,多出的位补0。这样就得到了,的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4 B8 A5

例子

  1. func TestStringToRune(t *testing.T) {
  2. s := "中华人民共和国"
  3. for _, c := range s {
  4. t.Logf("%[1]c %[1]x", c)
  5. }
  6. }
  7. // output:
  8. // 中 4e2d
  9. // 华 534e
  10. // 人 4eba
  11. // 民 6c11
  12. // 共 5171
  13. // 和 548c
  14. // 国 56fd

字符与字符串区别

如下代码

  1. import "fmt"
  2. func main() {
  3. var ch byte
  4. var str string
  5. ch = 'a'
  6. fmt.Println(ch)
  7. str = "a"
  8. fmt.Println(str)
  9. }
  10. /*output
  11. 97
  12. a
  13. */

type 关键字

Type关键字在Go中作用非常重要,比如:

  • 定义结构体
  • 定义接口
  • 自定义类型
  • 定义类型别名

自定义类型由一组值以及作用于这些值的方法组成,类型一般有类型名称,往往从现有类型组全通过type关键字构造出来一个新的类型

复杂类型

stuct

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. type Person struct{}
  7. var p Person
  8. fmt.Printf("p type is : %T, value is: %v", p, p)
  9. }

输出

  1. D:\projects\gocode\go100\breakdemo
  2. λ go run main.go
  3. p type is : main.Person, value is: {}