结构体

结构体定义

    type 结构体名 struct{
        字段1 字段1的类型
        字段2 字段2的类型
    }

结构体初始化

先声明再赋值

var p person // 声明一个person类型的变量P
p.name = "名字"
p.age = 18
fmt.Println(p)

声明同时初始化

键值对初始化

var p2 = person{
    "理想",
    100,
}
fmt.Println(p2)

注意事项

  1. 两者不能混用
  2. 没有赋值的字段会使用对应类型的零值

结构体指针

结构体是值类型,赋值的时候都是拷贝
当结构体字段较多的时候,为了减少内存消耗可以传递结构体指针

构造函数

返回一个结构体变量的函数,为了实例化结构体的到时候更省事

func newPerson(name string,age int)person{
    return person{
        name: name,
        age: age,
    }
}

方法

方法是作用于特定类型的函数
方法的定义:

func (接受者变量 接受者类型) 方法名(参数)返回值{
    // 方法体
}

接受者

接受者通常使用类型首字母的小写,不建议使用this和self这样的

值接受者和指针接受者的区别

使用值接受者的方法不能修改结构体变量
使用指针接收者的方法可以修改结构体的变量

标识符

// 标识符:变量名 函数名 类型名 方法名

匿名字段

没有名字的字段

嵌套结构体

type address struct{
    province string
    city string
}
type company struct{
    name string
    addr address // 嵌套
}

匿名嵌套结构体

type address struct{
    provice string
    city string
}
type company struct{
    name string
    address // 嵌套匿名结构体
}

匿名嵌套结构体的字段冲突

先在自己结构体找到这个字段,找不到就去匿名嵌套的结构体中查找该字段

type address struct{
    province string
    city string
}
type workPlace struct{
    province string
    city string
}
type person struct{
    name string
    age int
    address
    workPlace
}

结构体与json

json:一种跨语言的数据格式,多用于不同语言之间传递数据

// 1. 序列化:把go语言中的结构体变量 --> json格式的字符串
// 2. 反序列化: json格式的字符串 --> go语言中能够识别的结构体变量
type person struct{
    Name string `json:"name" db:"name" ini:"name"`
    Age int `json:"age"`
}
func main(){
    p1 := person{
        Name :"名称",
        Age : 18
    }
    // 序列化
    b, err := json.Marsha1(p1)
    if err!=nil{
        return
    }
    // 反序列化
    str := `{"name":"a","age":18}`
    var p2 person
    json.Unmarsha1([]byte(str),&p2)
    // 传指针是为了能够在json.Unmarsha1内部修改p2的值
}

posted @ 2021-09-14 10:58  lcsp  阅读(218)  评论(0编辑  收藏  举报