Skip to content

2.4、Golang 数据类型

数据类型

  • 布尔型 true/false
  • 字符串类型
  • 数字类型
    • 浮点型:
      • float32
      • float64
      • complex32
      • complex64
    • 无符号
      • uint8
      • uint16
      • uint32
      • uint64
    • 有符号
      • int8
      • int16
      • int32
      • int64
    • 其他
      • byte 类似 uint8
      • rune 类似 int32
      • uintptr 存放指针
  • 派生类型
    • 指针类型 Pointer
    • 数组类型
    • 结构化类型 struct
    • Channel类型
    • 函数类型
    • 切片类型
    • 接口类型interface
    • Map类型

示例

go
package main

import "fmt"

func foo() {}

func main() {
	// 字符串
	name := "Tom"
	fmt.Printf("name: %T\n", name) // name: string

	// 数字
	age := 23
	fmt.Printf("age: %T\n", age) // age: int

	// 布尔
	isStudent := true
	fmt.Printf("isStudent: %T\n", isStudent) // isStudent: bool

	// 指针
	ptr := &age
	fmt.Printf("ptr: %T\n", ptr) // ptr: *int

	// 数组
	arr := [...]int{1, 2, 3}
	fmt.Printf("arr: %T\n", arr) // arr: [3]int

	// 切片
	slice := []int{1, 2, 3}
	fmt.Printf("slice: %T\n", slice) // slice: []int

	// 函数
	fmt.Printf("foo: %T\n", foo) // foo: func()
}

布尔类型

true/false

定义

go
package main

import "fmt"

func main() {
    var b1 bool = true
    var b2 bool = false

    var b3 = true
    var b4 = false

    b5 := true
    b6 := false

    fmt.Printf("b1: %v\n", b1) // b1: true
    fmt.Printf("b2: %v\n", b2) // b2: false
    fmt.Printf("b3: %v\n", b3) // b3: true
    fmt.Printf("b4: %v\n", b4) // b4: false
    fmt.Printf("b5: %v\n", b5) // b5: true
    fmt.Printf("b6: %v\n", b6) // b6: false
}

应用

go
package main

import "fmt"

func main() {
   // if 逻辑判断
    age := 18
    if age >= 18 {
        fmt.Println("age >= 18")
    } else {
        fmt.Println("age < 18")
    }

    // for循环
    count := 5
    for i := 0; i < count; i++ {
        fmt.Printf("i: %v\n", i)
    }
}

注意:不能使用 0非0 表示真假

数字类型

  • 整型的零值是0
  • 浮点型的零值是0.0

整型

go
package main

import (
    "fmt"
    "math"
    "unsafe"
)

func main() {
    age := 18

    // 查看数据的大小
    fmt.Println(unsafe.Sizeof(age))
    // 8

    // 数据类型 int8 最大值和最小值
    fmt.Println(math.MinInt8, math.MaxInt8)
    // -128 127

}

进制格式化输出

go
package main

import "fmt"

func main() {
    age := 18

    // 十进制
    fmt.Printf("%d \n", age)
    // 18

    // 二进制
    fmt.Printf("%b \n", age)
    // 10010

    // 八进制
    fmt.Printf("%o \n", age)
    // 22

    // 十六进制
    fmt.Printf("%x \n", age)
    // 12
}

浮点型

go
package main

import (
    "fmt"
    "math"
)

func main() {

    // PI
    fmt.Printf("%f\n", math.Pi)
    // 3.141593

    // 保留两位小数点
    fmt.Printf("%.2f\n", math.Pi)
    // 3.14
}

字符串

字符串是一个任意字节的常量序列 [] byte

go
package main

import (
    "fmt"
)

func main() {

    var s1 string = "Hello"
    var s2 = "Hello"
    s3 := "Hello"

    fmt.Printf("s1: %v\n", s1)
    // s1: Hello

    fmt.Printf("s2: %v\n", s2)
    // s2: Hello

    fmt.Printf("s3: %v\n", s3)
    // s3: Hello
}

多行字符串

go
package main

import (
    "fmt"
)

func main() {

    var s string = `
<div>
    <div>Title</div>
</div>
    `

    fmt.Printf("%v\n", s)
}

使用 + 连接字符串

go
package main

import (
    "fmt"
)

func main() {
    s1 := "Tom"
    s2 := "20"

    msg := s1 + s2
    fmt.Printf("msg: %v\n", msg)
    // msg: Tom20
}

使用 Sprintf 连接字符串

go
package main

import (
    "fmt"
)

func main() {
    name := "Tom"
    age := "20"

    msg := fmt.Sprintf("name=%s, age=%s", name, age)
    fmt.Printf("msg: %v\n", msg)
    // msg: name=Tom, age=20
}

使用 strings.Join() 连接字符串

go
package main

import (
    "fmt"
    "strings"
)

func main() {
    name := "Tom"
    age := "20"

    str := strings.Join([]string{name, age}, ",")
    fmt.Printf("str: %v\n", str)
    // str: Tom,20

}

使用 bytes.Buffer 拼接字符串

go
package main

import (
    "bytes"
    "fmt"
)

func main() {
    var buffer bytes.Buffer

    buffer.WriteString("Tom")
    buffer.WriteString("Jack")
    buffer.WriteString("Steve")

    fmt.Println(buffer.String())
    // TomJackSteve

}

转义字符(escape char)

转义字符说明
\r回车,光标移动到行首
\n换行符,光标移动到下一行
\t制表位
\\反斜杆
\"双引号
\'单引号

示例

go
package main

import "fmt"

func main(){
    fmt.Println("Hello\tGolang")
    // Hello    Golang

    fmt.Println("Hello\nGolang")
    // Hello
    // Golang

    fmt.Println("Hello\rGolang")
    // Golang

    fmt.Println("Hello\\Golang")
    // Hello\Golang

    fmt.Println("Hello\"Golang")
    // Hello"Golang
}

字符串切片操作

go
package main

import "fmt"

func main() {

    // H e l l o   W o r l d
    // 0 1 2 3 4 5 6 7 8 9 10
    str := "Hello World"

    n := 3
    m := 5

    // 获取索引位置字符串的原始字节
    fmt.Println(str[n])
    // 108

    // 获取字符显示
    fmt.Printf("%c\n", str[n])
    // l

    // 获取 [n, m)的子串
    fmt.Println(str[n:m])
    // lo

    // 获取 [n, len)的子串
    fmt.Println(str[n:])
    // lo World

    // 获取 [0, m)的子串
    fmt.Println(str[:m])
    // Hello

}

字符串函数

函数说明
len(str)求长度
+ 或 fmt.Springf字符串拼接
strings.Contains判断是否包含
strings.HasPrefix前缀判断
strings.HasSuffix后缀判断
strings.Index子串位置
strings.LastIndex子串位置
strings.Split拆分
strings.Join()拼接
strings.ToLower()转小写
strings.ToUpper()转大写

示例

go
package main

import (
    "fmt"
    "strings"
)

func main() {

    str := "Hello World"

    fmt.Println(len(str))
    // 11

    fmt.Printf("%q\n", strings.Split(str, " "))
    // ["Hello" "World"]

    fmt.Println(strings.Join([]string{"Hello", "World"}, " "))
    // Hello World

    fmt.Println(strings.Contains(str, "Hello"))
    // true

    fmt.Println(strings.HasPrefix(str, "Hello"))
    // true

    fmt.Println(strings.HasSuffix(str, "World"))
    // true

    fmt.Println(strings.Index(str, "World"))
    // 6

    fmt.Println(strings.LastIndex(str, "World"))
    // 6

    fmt.Println("Hello" + " " + "World")
    // Hello World

    newStr := fmt.Sprintf("%s %s", "Hello", "World")
    fmt.Println(newStr)
    // Hello World

    fmt.Println(strings.ToLower("Hello World"))
    // hello world

    fmt.Println(strings.ToUpper("Hello World"))
    // HELLO WORLD

}