首页 > 代码库 > go结构,结构嵌套,接口,指针的测试和结论
go结构,结构嵌套,接口,指针的测试和结论
package mainimport ( "fmt")//T是M1接受者,不是实现M2接受者//*T是M1接受者,也是M2的接受者//所以T对象不可以赋值给接口对象。*T可以//结论:// 1.结构T实现接口I时,如果想通过方法改变其属性,则需要*T实现I所有方法:// 2.嵌套结构时,编译器会将子结构的属性和方法拷贝给父结构,与子结构无关系了;// 3.赋值给接口对象I1,或者接口作为函数参数时,I1:=&T,因为是*T实现了接口I,否则报错type T struct { Name string}func (t T) M1(name string) { // 值传递,改变副本的值 t.Name = name}func (t *T) M2(name string) { // 结构体指针,修改其本身 t.Name = name}type Intf interface { M1(name string) M2(name string)}func main() { fmt.Println(`*****t1 := T{"t1"}`) t1 := T{"t1"} fmt.Println("M1之前:", t1.Name) t1.M1("name1") fmt.Println("M1之后:", t1.Name) t1.M2("name2") fmt.Println("M2之后:", t1.Name) fmt.Println(`*****t2 := &T{"t2"}`) t2 := &T{"t2"} fmt.Println("M1之前:", t2.Name) t2.M1("name1") fmt.Println("M1之后:", t2.Name) t2.M2("name2") fmt.Println("M2之后:", t2.Name) // T does not implement Intf (M2 method has pointer receiver) // var t3 Intf = t1 var t3 Intf = &t1 t1.Name = "t1" fmt.Println(`****t3 Intf = &t1`) fmt.Println("M1之前:", t1.Name) t3.M1("name1") fmt.Println("M1之后:", t1.Name) t3.M2("name2") fmt.Println("M2之后:", t1.Name) t1.Name = "t0" fmt.Println("test1 before", t1.Name) test1(&t1) fmt.Println("test1 after", t1.Name) test2(&t1) fmt.Println("test2 after", t1.Name) // 只有*S实现I,且使用接口作为函数的参数时,需要传递&T,才能改变自身数据 t1.Name = "h1" test3(t1) fmt.Println(t1.Name) t1.Name = "h1" test4(&t1) fmt.Println(t1.Name) //嵌套类型 // 就是复制一份给新的结构,与原结构无关了 t1.Name = "t1" type S struct { T age int } s1 := S{T: t1, age: 12} fmt.Println(s1.Name, t1.Name) s1.M1("s1") fmt.Println(s1.Name, t1.Name) s1.M2("s2") fmt.Println(s1.Name, t1.Name) //新结构与接口 var I1 Intf = &s1}func test1(t Intf) { t.M1("n1")}func test2(t Intf) { t.M2("n2")}func test3(t T) { t.M2("m1")}func test4(t *T) { t.M2("m2")}
go结构,结构嵌套,接口,指针的测试和结论
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。