面向对象-1-构造函数与方法
一 面向对象初识
1.1 模拟构造函数
Go和传统的面向对象语言如Java有着很大区别。结构体没有构造函数初始化功能,可以通过以下方式模拟:
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func NewPersonByName(name string) *Person {
return &Person{
Name: name,
}
}
func NewPersonByAge(age int) *Person {
return &Person{
Age: age,
}
}
func main() {
p := NewPersonByName("zs")
fmt.Println(p) // {zs 0}
}
贴士:因为Go没有函数重载,为了避免函数名字冲突,使用了NewPersonByName
和NewPersonByAge
两个不同的函数表示不同的Person
构造过程。
1.2 父子关系结构体初始化
Person可以看做父类,Student是子类,子类需要继承父类的成员:
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
type Student struct {
Person
ClassName string
}
//构造父类
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}
//构造子类
func NewStudent(classname string) *Student {
p := &Student{}
p.ClassName = classname
return p
}
func main() {
s := NewStudent("一班")
fmt.Println(s) // &{{ 0} 一班}
}
1.3 Go中的面向对象初识
在Go中,可以给任意类型(除了指针)添加相应方法:
type Interger int
func (i Interger) Less (j Interger) bool {
return i < j
}
func main() {
var i Interger = 1
fmt.Print(i.Less(5))
}
二 方法
2.1 方法
Golang 中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是 struct。
方法的声明和调用:
func (recevier type) methodName(参数列表) (返回值列表){
//方法体
return 返回值
}
方法与函数的示例:
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
// 一个run函数
func run(p *Person, name string) {
p.Name = name
fmt.Println("函数 run...", p.Name)
}
// 一个run方法
func (p *Person)run() {
fmt.Println("方法 run...", p.Name)
}
func main() {
// 实例化一个对 象(结构体)
p1 := &Person{
"ruyue",
10,
}
// 执行一个普通方法
run(p1, "张三") // 输出 函数 run... 张三
// 执行方法
p1.run() // 输出 方法 run... 张三
}