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