速战速决 go - go 面向对象: 结构体(定义结构体,声明结构体,初始化结构体,使用结构体,匿名结构体)

速战速决 go https://github.com/webabcd/GoSample
作者 webabcd

速战速决 go - go 面向对象: 结构体(定义结构体,声明结构体,初始化结构体,使用结构体,匿名结构体)

示例如下:

oop/struct1.go

// go 面向对象 - 结构体(定义结构体,声明结构体,初始化结构体,使用结构体,匿名结构体)

package oop

import "fmt"

func Struct1Sample() {
	struct1_sample1()
	struct1_sample2()
}

func struct1_sample1() {
	// 声明一个指定类型的结构体(结构体中的每个成员会用默认值初始化)
	var a struct11
	fmt.Println(a) // {0  }
	// 为结构体成员赋值
	a.a = 0
	a.b = "abc"
	a.c = "xyz"
	// 输出结构体信息
	// %v 仅输出字段的值
	// %+v 输出字段的名称和字段的值
	// %#v 输出结构体类型,以及字段的名称和字段的值
	fmt.Printf("%v\n", a)  // {0 abc xyz}
	fmt.Printf("%+v\n", a) // {a:0 b:abc c:xyz}
	fmt.Printf("%#v\n", a) // oop.struct11{a:0, b:"abc", c:"xyz"}

	// 用 new() 声明的结构体返回的是指针
	b := new(struct11)
	// 因为 b 是指针,所以要按如下方式赋值
	(*b).a = 0
	// 因为 go 支持语法糖(syntactic sugar)技术,他会自动转换的,所以你可以按如下方式赋值
	b.a = 0
	b.b = "abc"

	// 声明一个指定类型的结构体,用 key/value 的方式对其成员做初始(不要求所有成员都初始化)化,也允许不手工初始化,但是 {} 要保留
	// 前面加 & 返回的就是指针,前面不加 & 返回的就是指针指向的值
	c := &struct11{
		a: 0,
		b: "abc",
	}
	fmt.Println(c) // &{0 abc }

	// 声明一个指定类型的结构体,按顺序对其成员做初始化(必须对每个成员都做初始化),也允许不手工初始化,但是 {} 要保留
	// 前面加 & 返回的就是指针,前面不加 & 返回的就是指针指向的值
	d := &struct11{
		0,
		"abc",
		"xyz",
	}
	fmt.Println(d) // &{0 abc xyz}

	// 使用结构体中的成员
	fmt.Println(d.a, d.b, d.c) // 0 abc xyz

	// 结构体的相等判断:如果两个结构体中的所有成员的值都相同,则这两个结构体是相等的
	fmt.Println(*b == *c, *b == *d) // true false
}

// 定义一个结构体
type struct11 struct {
	a    int
	b, c string
}

func struct1_sample2() {
	// 声明一个匿名结构体
	// 前面加 & 返回的就是指针,前面不加 & 返回的就是指针指向的值
	a := &struct {
		a int
		b string
	}{
		0,
		"abc",
	}
	fmt.Println(a) // &{0 abc}
}

速战速决 go https://github.com/webabcd/GoSample
作者 webabcd

posted @ 2022-02-08 14:26  webabcd  阅读(64)  评论(0编辑  收藏  举报