北京网站建设产品介绍,怎么用ai做网站版面,网站管理建设需进一步加强,wordpress 菜单显示文章目录 1、封装2、继承3、继承的注意点 1、封装
隐藏实现细节保证数据安全#xff08;控制变量或方法的访问范围#xff0c;private#xff09;
Go中实现封装#xff1a;
结构体、字段的首字母小写#xff08;Java的private#xff09;提供一个工厂模式函数#xf… 文章目录 1、封装2、继承3、继承的注意点 1、封装
隐藏实现细节保证数据安全控制变量或方法的访问范围private
Go中实现封装
结构体、字段的首字母小写Java的private提供一个工厂模式函数首字母大写public
//提供一个首字母大写的Set方法(类似其它语言的public)用于对属性判断并赋值
func (var 结构体类型名)SetXxx(参数列表){//加入数据验证的业务逻辑var.Age 参数
}//提供一个首字母大写的Get方法(类似其它语言的public)用于获取属性的值
func (var 结构体类型名) GetXxx() (返回值列表){return var.字段;
}示例 其他包中创建示例并对字段赋值 2、继承
和Java的extends相比Go中对结构体的继承通过匿名结构体实现如果一个struct嵌套了另一个匿名结构体那么这个结构体可以直接访问匿名结构体的字段和方法从而实现了继承特性。 代码实现
package main
import (fmt
)
//定义动物结构体
type Animal struct{Age intWeight float32
}
//给Animal绑定方法喊叫
func (an *Animal) Shout(){fmt.Println(我可以大声喊叫)
}
给Animal绑定方法自我展示
func (an *Animal) ShowInfo(){fmt.Printf(动物的年龄是%v,动物的体重是%v,an.Age,an.Weight)
}
//定义结构体Cat
type Cat struct{//为了复用性体现继承思维嵌入匿名结构体——》将Animal中的字段和方法都达到复用Animal
}
//对Cat绑定特有的方法
func (c *Cat) scratch(){fmt.Println(我是小猫我可以挠人)
}
func main(){//创建Cat结构体示例cat : Cat{}cat.Animal.Age 3cat.Animal.Weight 10.6cat.Animal.Shout()cat.Animal.ShowInfo()cat.scratch()
}
3、继承的注意点
1结构体可以使用嵌套匿名结构体所有的字段和方法无关父结构体字段方法的大小写
package main
import (fmt
)
//定义动物结构体
type Animal struct{Age intweight float32
}
//给Animal绑定方法喊叫
func (an *Animal) Shout(){fmt.Println(我可以大声喊叫)
}
给Animal绑定方法自我展示
func (an *Animal) showInfo(){fmt.Printf(动物的年龄是%v,动物的体重是%v,an.Age,an.weight)
}
//定义结构体Cat
type Cat struct{Animal
}func (c *Cat) scratch(){fmt.Println(我是小猫我可以挠人)
}
func main(){//创建Cat结构体示例cat : Cat{}cat.Animal.Age 3cat.Animal.weight 10.6cat.Animal.Shout()cat.Animal.showInfo() //小写也可以访问1cat.scratch()
}
2匿名结构体字段访问可以简化。下面两种等价cat.Age ---cat对应的结构体中找是否有Age字段如果有直接使用如果没有就去找嵌入的结构体类型中的Age 3当结构体和匿名结构体有相同的字段或者方法时编译器采用就近访问原则访问。想访问匿名结构体的方法或字段可加上结构体名
cat : Cat{}
cat.weight 9.4
cat.Age 10 //就近原则
cat.Animal.Age 20 //打破就近
cat.showInfo()//就近原则
cat.Animal.showInfo() //打破就近4和Java不同Go支持多继承
package main
import (fmt
)
type A struct{a intb string
}
type B struct{c intd string
}
type C struct{AB
}
func main(){//构建C结构体实例c : C{A{10,aaa},B{20,ccc}}fmt.Println(c)
}5多继承时父结构体若出现相同的字段名或者方法名访问时带结构体类型名
package main
import (fmt
)
type A struct{a intb string
}
type B struct{c intd stringa int
}
type C struct{AB
}
func main(){//构建C结构体实例c : C{A{10,aaa},B{20,ccc,50}}fmt.Println(c.b)fmt.Println(c.d)fmt.Println(c.A.a) 访问同名的字段fmt.Println(c.B.a) 访问同名的字段
}6结构体的匿名字段可以是基本数据类型 7嵌套匿名结构体后也可以在创建结构体变量(实例)时直接指定各个匿名结构体字段的值 8嵌入匿名结构体的指针也是可以的 9构体的字段可以是结构体类型的注意这是组合模式无关继承
type B struct{c intd stringa int
}