package main import "fmt" //定义一个Person类 type Person struct { id int name string age int } //分别定义Student与Teacher类,继承Person type Student struct { //匿名字段:只有类型,没有成员的名字 Person score float64 } type Teacher struct { Person salary float64 } func main() { var stu Student = Student{Person{101,"小松",20},23.5} var tea Teacher = Teacher{Person{10001,"小红",35},15000} fmt.Println(stu) fmt.Println(tea) } 执行结果: {{101 小松 20} 23.5} {{10001 小红 35} 15000}
func main() { //全部参数都进行初始化 var stu Student = Student{Person{101,"小松",20},23.5} var tea Teacher = Teacher{Person{10001,"小红",35},15000} //部分参数进行初始化 var stu1 Student = Student{score: 100} //只将父类中的参数进行初始化,且只对id进行初始化,这里需要注意初始化的方式 var stu2 Student = Student{Person:Person{id:1001}} fmt.Println(stu1) fmt.Println(stu2) fmt.Println(stu) fmt.Println(tea) } 执行结果: //由于id是与age为int类型,所以默认初始化为0,name由于是string类型,所以默认初始化为null {{0 0} 100} {{1001 0} 0} {{101 小松 20} 23.5} {{10001 小红 35} 15000}
func main() { var stu1 Student = Student{Person{101,"小松",20},95} var stu2 Student = Student{Person{10001,"小红",35},100} fmt.Println(stu1.id) fmt.Println(stu2.Person.id) } 执行结果: //先去Student对像中查找id,当Student对象中没有,回去父类对象中查找 101 10001
func main() { var stu1 Student = Student{Person{101,"小松",20},95} var stu2 Student = Student{Person{10001,"小红",35},100} //如果是调用其他函数老进行修改stu中的成员变量则需要使用到指针 var p *Student p = &stu1 updateInfo(p) //如果需要在本函数中进行修改 stu2.score = 60 fmt.Println(stu1.score) fmt.Println(stu2.score) } func updateInfo(stu *Student) { stu.score = 100 } 执行结果 100 60
import "fmt" type Person struct { id int name string age int } type Student struct { //匿名字段:只有类型,没有成员的名字 *Person score float64 } func main() { //需要注意指针类型匿名对象初始化与匿名对象初始化的区别,指针类型匿名对象初始化需要在匿名对象前加上&符号,用以获取对象的地址 var stu1 Student = Student{&Person{101,"小松",20},95} var stu2 Student = Student{&Person{10001,"小红",35},100} fmt.Println(stu1) fmt.Println(stu2) fmt.Println(stu2.name) } 执行结果: //因为Student对象是一个指针变量,所以打印的是一个地址,这个地址指向的是Person类初始化的内存地址 //如果需要打印初始化的内容,需要使用stu2.name的方式 {0xc00005a3c0 95} {0xc00005a3e0 100} 小红
import "fmt" type Object struct { id int } type Person struct { Object name string age int } type Student struct { //匿名字段:只有类型,没有成员的名字 *Person score float64 } func main() { //需要注意指针类型匿名对象初始化与匿名对象初始化的区别,指针类型匿名对象初始化需要在匿名对象前加上&符号,用以获取对象的地址 var stu1 Student = Student{&Person{Object{10011},"小松",20},95} var stu2 Student = Student{&Person{Object{10012},"小红",35},100} fmt.Println(stu1) fmt.Println(stu2) fmt.Println(stu2.id) } 执行结果: {0xc00005a3c0 95} {0xc00005a3e0 100} 1001
import "fmt" type Student struct { id int name string age int } //给结构体添加方法 func (stu Student)showPrint() { fmt.Println(stu) } func main() { stu := Student{10086,"小松",34} //由于已经给结构体添加方法因此,这里可以直接调用func函数(方法) //完成对象方法的调用,并将对象的值传递给方法 stu.showPrint() } 打印结果: {10086 小松 34}
import "fmt" type Student struct { id int name string age int } func (stu Student)showPrint() { fmt.Println(stu) } func (stu *Student)EditInfo() { stu.name = "小明" } func main() { stu := Student{10086,"小松",34} //想要利用结构体方法去修改初始化参数值,需要引入指针 stu.EditInfo() stu.showPrint() } 执行结果: {10086 小明 34}
import "fmt" type Person struct { name string age int sex string } type Teacher struct { Person school string } func (p *Person)showPerson() { fmt.Println(p) } func main() { mathTeacher := Teacher{Person{"小明",34,"女"},"北京大学"} mathTeacher.showPerson() } 执行结果: &{小明 34 女}
import "fmt" //定义一个父类 type Person struct { name string age int sex string } type Teacher struct { Person school string score float64 } //给父类添加一个方法 func (p *Person)printInfo(){ fmt.Println("这是父类中的方法") } func (t *Teacher)printInfo() { fmt.Println("这是子类中的方法") } func (p *Person)showPerson() { fmt.Println(p) } func main() { var tea Teacher tea.printInfo() tea.Person.printInfo() //通过调用该方式调用父类中的方法 } //如果父类中的方法名称与子类中的方法名称相同,通过子类的对象调用的是子类中的方法 执行结果: 这是子类中的方法
import "fmt" type Person struct { name string age int sex string } //给父类添加一个方法 func (p *Person)printInfo(){ fmt.Println("这是父类中的方法") } func main() { per := Person{"小明",16,"男"} //f为方法类型的数据 //f := per.printInfo //fmt.Printf("%T\n",f) //f() //方法表达式 f := (*Person).printInfo f(&per) }