go语言的魔幻旅程07-结构体

醉酒当歌,人生几何,譬如朝露,去日苦多

少不读水浒,老不读三国,不知道为什么会流传下来这样的两句话,少年时代一度酷爱观看三国系列相关的电视剧、电影,尤其是每当剧情发展到刘关张桃园三结义的时候更是热血汹涌,总感觉大汉的天下就应该让刘备这样的人才取得,可最后的结果不仅没能让刘备取得天下,反而自己的儿子落的个乐不思蜀的结局。相反曹操虽然性格在电视剧中刻画的比较冷库无情,后世都称之为一代奸雄,但是从今天的角度来看无论是从能力上还是从个人的文化造诣上,刘备与曹操都不在一个台阶上,假如没有赤壁大战的惨败,不知历史的进程将走向何方? 醉酒当歌,人生几何,譬如朝露,去日苦多。词虽好词,但格调稍显落寞,正好衬托编程的学习之路。


结构体

1、什么是结构体?

定义:结构体是用户定义的类型,表示若干个字段的集合(同样可以讲结构体变量理解为其他语言中的类,字段就是其他类中的属性)

//一般的表示形式
type name struct {
    attribute1 type
    attribute2 type
    ...
}

//举个栗子
type Employee struct {
    firstName string
    lastName  string
    age       int
}

2、结构体的分类

结构体的大致从声明方式的角度可以划分为以下的几类:命名结构体、匿名结构体

//命名结构体
type Employee struct {  
    firstName, lastName string
    age, salary         int
}

//匿名结构体
    emp3 := struct {
        firstName, lastName string
        age, salary         int
    }{
        firstName: "Andreah",
        lastName:  "Nikola",
        age:       31,
        salary:    5000,
    }

3、结构体的匿名字段

type Person struct {
    string
    int
}

//举个例子
func main() {  
    p := Person{"Naveen", 50}
    fmt.Println(p)
}

4、结构体的镶嵌

//举个栗子
type Address struct {  
    city, state string
}
type Person struct {  
    name string
    age int
    address Address
}

func main() {  
    var p Person
    p.name = "Naveen"
    p.age = 50
    p.address = Address {
        city: "Chicago",
        state: "Illinois",
    }
    fmt.Println("Name:", p.name)
    fmt.Println("Age:",p.age)
    fmt.Println("City:",p.address.city)
    fmt.Println("State:",p.address.state)
}

5、结构体的相等性

结构体是值类型,如果它的每一个字段都是可以比较的,则该结构体是可以进行比较的。如果两个结构体变量对应的值类型是相等的,则这两个结构体是相等的

//举个栗子
type name struct {  
    firstName string
    lastName string
}


func main() {  
    name1 := name{"Steve", "Jobs"}
    name2 := name{"Steve", "Jobs"}
    if name1 == name2 {
        fmt.Println("name1 and name2 are equal")
    } else {
        fmt.Println("name1 and name2 are not equal")
    }

    name3 := name{firstName:"Steve", lastName:"Jobs"}
    name4 := name{}
    name4.firstName = "Steve"
    if name3 == name4 {
        fmt.Println("name3 and name4 are equal")
    } else {
        fmt.Println("name3 and name4 are not equal")
    }
}

6、带标签的结构体

结构体中的字段除了名字和类型之外,还有一个可选的标签,它是一个附属于字段的字符串,可以是文档或其他的重要标记。标签的内容不可以在一般的编程中使用,只有包 reflect 能获取它

//举个栗子
type TagType struct { // tags
    field1 bool   "An important answer"
    field2 string "The name of the thing"
    field3 int    "How much there are"
}

7、结构体的值分配

//举个栗子
type struct1 struct {
    i1  int
    f1  float32
    str string
}

func main() {
    ms := new(struct1)
    ms.i1 = 10
    ms.f1 = 15.5
    ms.str= "Chris"

    fmt.Printf("The int is: %d\n", ms.i1)
    fmt.Printf("The float is: %f\n", ms.f1)
    fmt.Printf("The string is: %s\n", ms.str)
    fmt.Println(ms)
}

小结

结构体部分的知识总的来讲是非常重要的,如果这部分的内容无法攻克下来,从良心的角度出发,我真诚的建议学习的人还是放弃这门语言的学习吧,一个没有掌握结构体知识的编程者,在go语言的学习中丝毫没有任何的优势而言,后续的无论是进阶内容的学习还是框架的学习,基本离不开结构体的知识,因此,结构体是go前行道路上必须攻克的一道门槛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值