golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class。
类的声明:
//声明一个类
type People struct {
Name string
Sex int32
Address string
}
这样就声明了一个类,其中没有public、protected、private的的声明。golang用另外一种做法来实现属性的访问权限:属性的开头字母是大写的则在其它包中可以被访问,否则只能在本包中访问。类的声明和方法亦是如此。
类方法声明:
//声明一个类的方法 func (people People) Publish() { fmt.Println("method :Publish") } func (people *People) Show(name string) { fmt.Println(name) }
和其它语言不一样,golang声明方法和普通方法一致,只是在func后增加了poem *Poem这样的声明。加*和没有加*的区别在于一个是传递指针对象,一个是传递值对象。
实例化对象:
//实例化People类对象 p := &People{} p.Name = "Name1" fmt.Println("p Name:", p.Name) p2 := &People{Name: "Name2"} fmt.Println("p2 Name:", p2.Name) p3 := new(People) p3.Name = "Name3" fmt.Println("p3 Name:", p3.Name) p4 := People{} p4.Name = "Name4" fmt.Println("p4 Name:", p4.Name) p5 := People{Name: "Name5"} fmt.Println("p5 Name:", p5.Name) p6 := NewPeople("张三") fmt.Println("p6:Name-", p6.Name)
实例化的时候可以初始化属性值,如果没有指明则默认为系统默认值
加&符号和new的是指针对象,没有的则是值对象,这点和php、java不一致,在传递对象的时候要根据实际情况来决定是要传递指针还是值。
小技巧提示:当对象比较小的时候传递指针并不划算。
构造函数:
golang并没有构造函数一说。如果一定要在初始化对象的时候进行一些工作的话,可以自行封装产生实例的方法。
func New类名(param string, p ...interface{}) (参数 *类名)
//构造函数 func NewPeople(name string) (people *People) { people = &People{} //初始化 people.Name = name people.Show(name) return }
构造函数的调用
p6 := NewPeople("张三") fmt.Println("p6:Name-", p6.Name)
继承(组合):
//类的继承也可以称为类的组合
type ChinaPeople struct {
People
Title string
Name string
}
ChinaPeople 属性中声明了Name,表示组合了People的属性和方法。可以像如下方式调用(如果其中属性有冲突,则以外围的为主。):
chinaP := &ChinaPeople{} chinaP.Name = "China" fmt.Println(chinaP) fmt.Println("ChinaPeople Name:", chinaP.Name, " of value") chinaP.People.Name = "People-Name" fmt.Println(chinaP) fmt.Println("People Name", chinaP.People.Name, " of value")
输出结果:
方法重载:
//方法重载 func (people *People) Receive(v ...interface{}) { fmt.Println(v) }
重载调用:
fmt.Println("方法的重载:") p7 := &People{} p7.Receive("Receive", 890) p7.Receive("Receive", 890, "abcd")
执行结果:
有疑问加站长微信联系(非本文作者)