Go 语言对数据和方法的封装是一种分离式的封装
由于在go语言中没有class关键字,因此没有类的方式对数据(属性)和方法进行封装
1、通过struct完成属性的封装
2、方法与结构体进行绑定
package main
import (
"fmt"
)
//创建结构体,并声明属性
type Person struct {
name string
}
//将Person结构体与Say方法进行绑定
func (p *Person) Say(content string) string {
return content
}
func (p *Person) SetName(name string) {
p.name = name
}
func (p *Person) GetName() string {
return p.name
}
func main() {
p := Person{"xiangming"}
fmt.Println(p.Say("Hello sa"))
p.SetName("zhangshan")
fmt.Println(p.GetName())
}
Go 完成封装后是如何对属性和方法的可访问性进行控制的
D:\go_work\src\helloworld\main.go
package main
import (
"fmt"
"helloworld/person"
)
func main() {
p := new(person.Person)
p.SetName("coding")
fmt.Println(p.Say("Hello Conding"),p.GetName())
}
D:\go_work\src\helloworld\person\person.go
package person
//创建结构体,并声明属性
type Person struct {
name string
age int
}
//将结构体与方法进行绑定
func (p *Person) Say(content string) string {
return content
}
func (p *Person) SetAge(age int) {
p.age = age
}
func (p *Person) SetName(name string) {
p.name = name
}
func (p *Person) GetAge() int {
return p.age
}
func (p *Person) GetName() string {
return p.name
}
Go 实现继承和方法的覆写
Go 实现继承时不用 interface,它其实也不是真正的继承
D:\go_work\src\helloworld\main.go
package main
import (
"fmt"
"helloworld/person"
)
func main() {
p := new(person.Person)
p.SetName("coding")
w := new(person.Worker)
w.SetName("worker")
w.Company = "测试"
//&{coding 0}
fmt.Println(p)
//&{{worker 0} 测试} 第二个花括号表示从Person中继承的内容
fmt.Println(w)
//Hi
fmt.Println(p.Say("Hi"))
//测试:Hi
fmt.Println(w.Say("Hi"))
}
D:\go_work\src\helloworld\person\person.go
package person
//创建结构体,并声明属性
type Person struct {
name string
age int
}
//将结构体与方法进行绑定
func (p *Person) Say(content string) string {
return content
}
func (p *Person) SetName(name string) {
p.name = name
}
func (p *Person) GetName() string {
return p.name
}
D:\go_work\src\helloworld\person\worker.go
package person
// 继承Person
type Worker struct {
Person
Company string
}
//将结构体与方法进行绑定
//覆写Person方法Say
func (w *Worker) Say(content string) string {
return w.Company + ":" + content
}
Go 多态
D:\go_work\src\helloworld\main.go
package main
import (
"fmt"
"helloworld/person"
)
func say(base person.PersonBehavior) {
fmt.Println(base.Say("Hi"))
}
func main() {
p := new(person.Person)
p.SetName("coding")
w := new(person.Worker)
w.SetName("worker")
w.Company = "测试"
s := new(person.Student)
s.SetName("worker")
say(p)
say(w)
say(s)
}
基类
D:\go_work\src\helloworld\person\person.go
package person
type PersonBehavior interface {
Say(content string) string
}
//创建结构体,并声明属性
type Person struct {
PersonBehavior
name string
}
//将结构体与方法进行绑定
func (p *Person) Say(content string) string {
return content
}
func (p *Person) SetName(name string) {
p.name = name
}
func (p *Person) GetName() string {
return p.name
}
D:\go_work\src\helloworld\person\worker.go
package person
// 继承Person
type Worker struct {
Person
Company string
}
//将结构体与方法进行绑定
//覆写Person方法Say
func (w *Worker) Say(content string) string {
return w.Company + ":" + content
}
D:\go_work\src\helloworld\person\student.go
package person
type Student struct {
Person
School string
}
// 覆写 Person方法
func (s *Student) Say(content string) string {
return "学生:" + content
}