# 基本数据类型

# 概述

数据类型是每个语言必有的,每个语言的数据类型大致相同。文章的目录如下:

  • 布尔类型
  • 数字类型
  • 字符串
  • nil(空)
  • 派生类

Go 语言声明变量使用 var 关键字。

# 1. 布尔

布尔类型,可取 turefalse 两个值,true 表示真,false表示假。

var b bool = true

每个变量前面都包含一个 var,可以不写。

也可以直接赋值,Go 语言可以推断处类型。

flag := false

也可以先声明,后赋值,如果先声明,默认值 false

var flag bool

# 2. 数字

按照类型数字可分为整型和浮点型,整型(int)数据是没有小数位,浮点型(float)数据类型有小数位。

(1) 整型(int)

保存的数没有小数位,那么适合使用整型来保存。

var num int = 16

使用 var 关键字,之后使用变量名,最后是类型,同时可以赋值。

也可以直接赋值,GO 语言会自动推断类型。

n := 123 // 将 n 自动推导为 int
// 或
var n = 1 // 将 n 自动推导为 int

如果只有声明,没有声明,变量为默认赋值为 0。

var num int

int 类型的数据会占用长度不确定,32 为电脑中占 4 字节,64 为电脑中占 8 字节。

// 引入多个模块的写法
import (
    "fmt"
    "unsafe"
)

fmt.Println(unsafe.Sizeof(b)) // 4 或 8

为了与其他语言统一类型,还有一些整数类型,下面具体介绍。

这是整数简单的应用,正数可细分为以下几个,使用都一样,存储的大小不同。

  • int8:有符号整数,一个字节,可存储 -128 ~ 127(-2^7 ~ 2^7 - 1)
  • int16: 有符号整数,两个字节,可存储 -2^15 ~ 2^15 - 1
  • int32: 有符号整数,四个字节,可存储 -2^31 ~ 2^31 - 1
  • int64: 有符号整数,八个字节,可存储 -2^63 ~ 2^63 - 1
  • uint8:无符号整数,一个字节,可存储 0 ~ 255(0 ~ 2^8 - 1)
  • uint16:无符号整数,一个字节,可存储 0 ~ 2^16 - 1
  • uint32:无符号整数,一个字节,可存储 0 ~ 2^32 - 1
  • uint64:无符号整数,一个字节,可存储 0 ~ 2^64 - 1

可以使用 Sizeof 方法查看大小。

import (
    "fmt"
    "math"
)

fmt.Println("int8:", math.MinInt8, "~", math.MaxInt8) 
// int8-128 ~ 127

如果赋值的数溢出会报错:

var num int8 = 166 // 报错

(2)浮点型(float)

go 语言中没有 double,只有 float.

  • float32:32位浮点型数
  • float64:64位浮点型数
var f float32 = 3.14
var f1 float64 = 3.1415

(3)其他类型

  • byte:uint8 类似
  • rune:int32 类似
  • uint:32 或 64 位
  • int:与 uint 一样大小
  • uintptr:无符号整型,用于存放一个指针

(3)iota

iota 是 Go 语言中的一个计数器。

const (
    n1 = iota // 0
    n2        // 1
    n3        // 2
    n4        // 3
)

这里会介绍一些常用技巧。

var i, j int
i, j = 2, 3
fmt.Println(i, j) // 2 3

# 3. 字符串

字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。

var s string = "Hello Go!" // 显示定义
// 或
var s = "Hello Go!" // 隐式定义
// 或
s := "Hello Go!" 

原始字符串,有些字符串中包含计算机指令,比如 \n,在字符串中有 \n 是换行。

fmt.Println("hello \n Go!")

显示结果如下, \n 换成了换行。

hello 
 Go!

如果我们想显示 \n 把字符串使用 `` 括起来,这个叫原始字符串。

fmt.Println(`hello \n Go!`)
// hello \n Go!

字符串的每个位置对应一个索引,像数组一样获取每一个字符,打印字符的 ASCII 码。

s := "hello"
fmt.Printf("%c", s[1]) // e

rune 是 int32 的别名,可以存放 utf-8 中的所有字符,字符串使用单引号(`) 阔的,默认推断为 rune 类型。

s := 'A' // s 的类型是 rune

s := 'ب'
fmt.Printf("%c", s) // ب

字符串可以加减操作。

s := 'a'
s = s + 1
fmt.Printf("%c",s) // b

字符串和字符串可以相加,不过多个字符串和数字不能相加。

s := "hello" + " Go"
// hello Go

s := "hello" + 10
// 报错

byte 是 int8 的别名.

字符串的长度可以使用,内置函数 len 来获取。

s := "hello"
fmt.Println(len(s)) // 5

需要注意的是 len 函数按照字节长度计算的。

s := "ب"
fmt.Println(len(s)) // 2

字符串可以用 range 进行遍历。

s := "hello Ǵo"
for i, c := range s {
    fmt.Printf("%v %c ", i, c)
}
// 0 h 1 e 2 l 3 l 4 o 5   6 Ǵ 8 o

i 是索引,c 是字符串。

# 4. nil

go 语言中 nil 表示零值或无。

go 语言中声明了一个引用类型,比如,数组,map等。没有赋给初始值的时候,就会 nil

var s string
s == nil // true

# 5. 派生类

由于派生类内容很多,在这里不会详细介绍,之后具体介绍每一数据类型。

包括:

  • 指针类型(Pointer)
  • 数组类型
  • 结构化类型(struct)
  • Channel 类型
  • 函数类型
  • 切片类型
  • 接口类型(interface)
  • Map 类型
更新时间: 12/30/2021, 9:57:33 AM