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

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

作者 webabcd

示例如下:

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