【struct】go的结构体|Go主题月

1,001 阅读2分钟

结构体组成

go结构体的结构体主要由typestruct两个关键字组成

当字段首字母为大写时,可以被外部包访问,相当于Javapublic字段,

当字段首字母为小写时,只能被当前包访问,外部包不能访问,相当于Javaprivate字段

结构体的名称也一样,小写时外部包就无法访问到这个结构体了。

type Address struct {
	Province string
	City	 string
	Country  string
	Detail   string
}

struct

声明结构体

  • 字面量声明

    addr:=Address{
        Province: "浙江省",
        City:     "杭州市",
        Country:  "滨江区",
        Detail:   "阿里巴巴",
    }
    
  • var声明

    var addr Address
    addr.Province="浙江省"
    addr.City="杭州市"
    addr.Country="滨江区"
    addr.Detail="阿里巴巴"
    

嵌套

一个结构体也可以包含另一个结构体,例如:

type People struct {
	Name string
	Addr Address
	Age  int
	alias string
}

type Address struct {
	Province string
	City	 string
	Country  string
	Detail   string
}

上面的People结构体包含了Address结构体,然后在声明的时候可以这样

zheng:=People{
    Name:  "",
    Addr:  Address{
        Province: "",
        City:     "",
        Country:  "",
        Detail:   "",
    },
    Age:   0,
    alias: "",
}

方法

go的函数的接收器就是对应这个接收器的方法

method

值接收器

使用值接收器时,在方法里对接收器进行修改时,不会影响源接收器的数据

func (p People) Info()  {
    
}

指针接收器

使用指针接收器时,在方法里对接收器进行修改会影响源接收器的数据

func (p *People) Update()  {
    
}

多态

当多个方法实现同一个接口的方法时,就可以使用多态了

import "fmt"

func main() {

	var li Lilei
	speak(li)
    
	var z ZhangSan
	speak(z)
}
// 函数
func speak(say Say)  {
	say.Say()
}
// 定义接口
type Say interface {
	Say()
}
// 结构体
type Lilei struct {

}
type ZhangSan struct {

}
// 实现方法
func (l Lilei) Say()  {
	fmt.Println("我是李雷")
}
func (z ZhangSan) Say()  {
	fmt.Println("我是张三")
}

标签

在我们定义结构体时,同时还可以给字段设置标签。一般常用的标签有jsonxml。然后可以通过反射把字段映射到设置的标签上。

设置标签时 字段首字母要大写

  • 单个标签
type People struct {
    Name string `json:name`
}
  • 多个标签

    同时也可以定义多个标签

    两个类型的标签中间用空格隔开

    type People struct {
        Name string `json:"province" xml:"province"`
    }