golang 结构体(struct)

1. 结构体定义

  • Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Gelang是基于struct来实现OOP特性的。
  • 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和一个类型。

2. 结构体创建

需要注意的是:

  • 结构体的包名在同一个包内必须唯一,不能重复
  • 结构体的字段必须唯一,不能重复
  • 同类型的结构体字段可以放在一行定义

结构体格式

type structname struct {
  field1 type
  field2 type
    ...
}

type:结构体定义关键字
structname:结构体名称
struct:结构体定义关键字
field type:成员变量名称,成员数据类型

3. 结构体的初始化

没有初始化的结构体默认值都为类型的默认值。

3.1 直接创建初始化

package main

import "fmt"

// 定义一个Perple结构体
type People struct {
	SurName string
	Age     int
	sex     string
}

func main() {
	//创建一个实例
	var p1 People
	p1.SurName = "张"
	p1.Age = 20
	p1.sex = "男"
	fmt.Println(p1)
}

执行结果

{张 20 男}

3.2 根据成员初始化

package main

import "fmt"

// 定义一个Perple结构体
type People struct {
	SurName string
	Age     int
	sex     string
}

func main() {
	var p2 People
	/*	p2 = People{ //根据声明的成员名称初始化。注意:最后的逗号不能少
		Age:     24,
		SurName: "李",
		sex:     "男",
	}*/
	p2 = People{ //根据结构体声明顺序初始化,顺序不能变
		"李",
		24,
		"男",
	}
	fmt.Println(p2)
}

执行结果

{李 24 男}

3.3 初始化部分成员

package main

import "fmt"

// 定义一个Perple结构体
type People struct {
	SurName string
	Age     int
	sex     string
}

func main() {
	p3 := People{ //初始化部分成员,,没有初始化的成员为类型默认值
		SurName: "詹",
		sex:     "女",
	}
	fmt.Println(p3)
}

执行结果

{詹 0 女}

4. 结构体指针

image

package main

import "fmt"

// 定义一个Perple结构体
type People struct {
	SurName string
	Age     int
	sex     string
}

func main() {
	p4 := People{
		"李",
		24,
		"男",
	}
	var p4_pointer = new(People) //等价于var p4_pointer *People
	p4_pointer = &p4
	fmt.Printf("p4的内存地址为:%p\n", p4_pointer)
	fmt.Printf("p4的值为:%v\n", *p4_pointer)
	//修改实例的值
	(*p4_pointer).SurName = "张" //*的作为为根据内存地址取值,这个*号可以省略
	p4_pointer.Age = 28
	fmt.Printf("p4的值为:%v\n", *p4_pointer)
}

执行结果

p4的值为:{李 24 男}
p4的值为:{张 28 男}

5. 结构体实例跟json格式转换

5.1 实例转json

image

package main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Name    string
	Age     int
	Provice string
}

func main() {
	//实例转json格式
	s := Student{
		Name:    "li",
		Age:     25,
		Provice: "JX",
	}
	s1, err := json.Marshal(s) //将实例转为json格式
	if err != nil {
		fmt.Println("err:", err)
	}
	fmt.Println(string(s1)) //转换后的s1为[]byte类型,需要转为字符串类型
}

执行结果

{"Name":"li","Age":25,"Provice":"JX"}

5.2 json转实例

image

package main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Name    string
	Age     int
	Provice string
}

func main() {
	//json转结构体实例
	j := `{"Name":"li","Age":25,"Provice":"JX"}` //定义一个json格式字符串
	var j1 Student //定义一个实例
	err := json.Unmarshal([]byte(j), &j1)
	if err != nil {
		fmt.Println("err:", err)
	}
	fmt.Printf("%#v", j1)
}

执行结果

main.Student{Name:"li", Age:25, Provice:"JX"}

6. 结构体标签(tag)

标签定义:json:"标签名"

package main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Name    string `json:"name""`
	Age     int    `json:"age""`
	provice string // 小写字母开头的不会参与序列化
}

func main() {
	//结构体实例转json格式
	s := Student{
		Name:    "li",
		Age:     25,
		provice: "JX",
	}
	s1, err := json.Marshal(s) //将实例转为json格式
	if err != nil {
		fmt.Println("err:", err)
	}
	fmt.Println(string(s1)) //转换后的s1为[]byte类型,需要转为字符串类型
}

执行结果

{"name":"li","age":25}
posted @ 2023-03-07 18:29  XIN-0808  阅读(151)  评论(0编辑  收藏  举报