Go 第3章 数据类型 Go 第3章 数据类型

2021-06-07

一、变量定义

变量类型写在变量名之后

使用 var 关键字

var a, b, c bool 
var s1, s2 string="hello", "world"

使用 var() 集中定义变量

var (
   i = 00
   o = 22
)

让编译器自动决定类型

var a, b, i, sl, s2 = true, false, 3, "hello", "world"

使用 := 定义变量(只能在函数内使用)

a, b, i, s1,s2 := true, false, 3, "hello", "world"

关键字(不能够作为变量名的词)

  • 2 个包管理 :import、package

  • 8 个程序实体声明与定义:chan、const、func、interface、map、struct、type、var

  • 15 个程序流程控制:break、case、continue、default、defer、else、fallthrough、for、 go、goto、if、range、return、select、switch

  • 36 个预定义标识符:int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64、float32、float64、complex、complex64、complex128、append、bool、byte、cap、close、copy、false、imag、iota、len、make、new、nil、panic、print、println、real、recover、 string、true、uintptr

二、基本数据类型

  • 整数类型

    • (u)int、(u)int8、(u)int16、(u)int32、(u)int64:不加 u 表示无符号整数

      • 具体类型基本数据类型取值范围

        • int8 —— 128 到 127,即 -2^7 到 2^7 - 1

        • uint8 —— 0 到 255,即 0 到 2^8 - 1

        • int16 —— -32768 到 32767,即  -2^15 到 2^15 - 1

        • uint16 —— 0 到 65535,即 0 到 2^16 - 1

        • int32 —— -2147483648 到 2147483647,即  -2^31 到 2^31 - 1

        • uint32 —— 0 到 4294967295,即 0 到 2^32 - 1

        • int64 —— -9223372036854775808 到 9223372036854775807,即  -2^63 到 2^63 - 1

        • uint64 —— 0 到 18446744073709551615,即 0 到 2^64 - 1

    • byte:需要字节存储时候才会用到,一般是字节组成的数组

    • rune:等价于 int32 存储一个 unicoed 编码

  • 浮点类型

    • float32、float64

  • 字符串类型

    • string

  • 布尔类型

    • bool

  • 复数类型:原生支持复数类型

    • complex64、complex128

①、数据类型判断

fmt.Sprintf("%T",变量或值)

②、强类型转换

  • string 到 int

    • int,err:=strconv.Atoi(string)

  • string 到 int64

    • int64,err := strconv.Parselnt(string, 10, 64)

  • int 到 string

    • string:=strconv.ltoa(int)

  • int64 到 string

    • string:=strconv.Formatlnt(int64,10)

  • string 到 float32/float64

    • float32,err = ParseFloat(string,32)

    • float64,err = ParseFloat(string,64)

  • int64 转 int

    • int:=int(int64)

  • int 转 int64

    • int64:=int64(int)

三、复杂数据类型

  • 结构 struct

  • 接口 interface

  • 数组[数组长度]值类型(值1,值2)

  • 切片slice []值类型{值1,值2}

  • map [key类型]值类型{key:值}

  • 指针 * uintptr

  • 函数 func

  • 管道 chan

四、包

  • 新建文件 test/test.go

package test

var A string = "test"
  • 新建文件 test/test2.go

package test

var B string = "test2"
  • 修改 main.go

package main

import (
   "fmt"
   "goclass/test"
)

func main() {
   fmt.Println(test.A)
   fmt.Println(test.B)
}
  • 修改 main.go

package main

import (
   "fmt"
   t "goclass/test"
)

func main() {
   fmt.Println(t.A)
   fmt.Println(t.B)
}
  • 修改 main.go

package main

import (
   "fmt"
   . "goclass/test"
)

func main() {
   fmt.Println(A)
   fmt.Println(B)
}
  • 共有与私有(根据首字母大小写划分)

    • test/test.go 和 test/test2.go 中有两个变量首字母是大写,所以可以在其他文件中使用

五、常量与枚举

5.1、常量

  • const filename="abc.txt"

  • const 数值可作为各种类型使用

  • const a,b = 3,4

  • var c int = int(math.Sqrt(a*a+b*b))

5.2、枚举

  • 普通枚举类型

const (
   a = 0
   b = 1
   c = 2
   d = 3
   e = 4
)
  • 自增枚举类型

const (
   a = iota
   _
   c
   d
   e
)
const (
   a = 1 << (10 * iota)
   b
   c
   d
   e
)

六、字符和字符串处理

6.1、rune

  • rune 相当于 go 的char

  • 使用 range 遍历 pos, rune 对

  • 使用 utf8.RuneCountInString 获得字符数量

  • 使用 len 获得字节长度

  • 使用 []byte 获得字节

6.2、代码

package main
import (
    "fmt"
    "unicode/utf8"
)
func main() {
    s := "Yes我爱鲁鲁博客!" // UTF-8
    fmt.Println(s)
    for _, b := range []byte(s) {
fmt.Printf("%X ", b)
    }
    //59 65 73 E6 88 91 E7 88 B1 E9 B2 81 E9 B2 81 E5 8D 9A E5 AE A2 21
    fmt.Println()
    for i, ch := range s { // ch is a rune
fmt.Printf("(%d %X) ", i, ch)
    }
    //(0 59) (1 65) (2 73) (3 6211) (6 7231) (9 9C81) (12 9C81) (15 535A) (18 5BA2) (21 21)
    fmt.Println()
    fmt.Println("Rune count:",
utf8.RuneCountInString(s))
    //Rune count: 10
    bytes := []byte(s)
    for len(bytes) > 0 {
ch, size := utf8.DecodeRune(bytes)
bytes = bytes[size:]
fmt.Printf("%c ", ch)
    }
    //Y e s 我 爱 鲁 鲁 博 客 !
    fmt.Println()
    for i, ch := range []rune(s) {
fmt.Printf("(%d %c) ", i, ch)
    }
    //(0 Y) (1 e) (2 s) (3 我) (4 爱) (5 鲁) (6 鲁) (7 博) (8 客) (9 !)
    fmt.Println()
}

6.3、其他字符串操作

  • Fields、Split、Join

  • Contains、Index

  • ToLower、ToUpper

  • Trim、TrimRight、TrimLeft

阅读 987