【GoLand】结构体定义、初始化及易错点

306 阅读1分钟

一、结构体定义和初始化

1.通过new和&{}的初始化方式获取的是结构体指针类型

package main

import "fmt"

// 结构体定义
type Person struct {
    id   int
    name string
}

func main() {
    // 初始化1:基本实例初始化
    var p1 Person
    p1.id = 100
    p1.name = "Sam"

    // 初始化2:创建指针类型初始化
    p2 := new(Person)
    p2.id = 200
    p2.name = "Tom"

    // 初始化3:取结构体地址实例化
    p3 := &Person{
        id : 300,
        name : "TT",
    }

    fmt.Println(p1)
    fmt.Println(p2)
    fmt.Println(p3)
}

二、结构体使用易错点

1.结构体与sync.Map共同使用,空接口转换时,要与Store到Map时的结构体类型一致(值类型还是指针类型)

package main

import (
   "fmt"
   "sync"
)

// 结构体定义
type Person struct {
    id   int
    name string
}

func main() {
    var tab sync.Map
    var p1 Person
    p2 := new(Person)

    p1.id = 1
    p1.name = "Sam"

    p2.id = 2
    p2.name = "Tom"

    tab.Store(1, p1)
    tab.Store(2, p2)

    if value, ok := tab.Load(1); ok {
        node1 := value.(Person)
        fmt.Println(node1)
    }
    if value, ok := tab.Load(2); ok {
        node2 := value.(*Person)
        fmt.Println(node2)
    }
} 

2.结构体比较的易错点

  • (1)12行的结构体类型比较会正常输出
  • (2)24行的结构体类型比较会编译报错
  • (3)结构体类型只能比较常规类型布尔、字符串、指针、整型等,但凡成员变成map、slice、channel等类型,则不可比较类型
  • (4)如果结构体成员顺序不一致,也会导致结构体类型不一致