golang - @amazeUI - 2017-09-12 13:51:56
type person struct {
Name string
Age int
}
type user struct {
Name string
Age int
Info struct { //结构体嵌套一个匿名结构体
Phone string
City string
}
}
type test struct { //声明一个匿名字段struct
string
int
}
type human struct {
Sex string
Name string
Age int
}
type student struct {
human
Parent_phone string
}
type teacher struct {
human //将上面的human组合进来
Subject string
}
func main() {
//struct结构体
a := person{Name: "hk"} //可以把这个struct看做成一个php对象与json对象的组合
a.Age = 13 //可以这样用.取值和赋值
fmt.Println(a)
A(a) //从这里能够看出来,这里传递过去的是一个值的拷贝,在A函数里面对这个struct的修改并不会影响到a
fmt.Println(a) //如果加&符号,则是引用传递,修改就会改变原有的值
b := struct { //匿名结构体
Name string
Age int
}{ //在声明struct的同时,可以声明值
Name: "pp",
Age: 11, //这里结尾必须要加上逗号
}
fmt.Println(b)
c := user{Name: "pys", Age: 14} //第一层可以这样给结构体内的字段赋值
c.Info.Phone = "iphone4s" //匿名结构体只能勇敢这种方式给赋值
c.Info.City = "shanghai"
fmt.Println(c)
d := test{"test", 4} //匿名字段结构体直接按照声明字段顺序赋值
var e test
e = d //同个struct可以直接赋值,非同个struct不可以进行比较
fmt.Println(d == e)
//golang之中没有面向对象,但是可以通过一些特性实现一些面向对象的特性例如继承,在go里面叫包含
//上面声明了三个结构,human,studen,teacher,按面向对象来做的话,他们都需要继承human,因为
//human里的属性包含了一个人最基本的属性,但是学生和老师又不一样
t1 := teacher{Subject: "语文", human: human{Sex: "男"}} //对于有组合的结构体来说
//这个human只是一个字段,后一个human才代表human这个结构体,所以可以这样赋值
t1.Age = 15 //因为是组合过来的,所以也可以这样赋值
fmt.Println(t1)
}
func A(per person) {
per.Age = 19
fmt.Println(per)
}