在定义一个结构体的时候,实际上就是把一类事物的共有的属性和行为提取出来,行成一个物理模型。这种研究问题的方法称为抽象。
面向对象编程的三大特性:
Golang仍然有面向对象编程的继承,封装和多态特性,只是实现的方式和其他OOP语言不一样,Golang的三大特性是如何实现?
1)将结构体、字段(属性)的首字母小写(不能导出,其他包不能使用,类似private)
2)给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数
3)提供一个首字母大写的Set方法(类似其他语言的public),用于对属性判断并赋值
func(var 结构体类型名) SetXxx(参数列表) (返回值列表){
//加入数据验证的业务逻辑
var.字段= 参数
}
4)提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值
func(var 结构体类型名) GetXxx(){
return var.字段
}
特别说明:在Golang开发中并没有特别强调封装,Golang本身对面向对象的特性做了简化。
1)创建一个model的包,在包中创建一个person的结构体和相关方法,限制个别属性是否允许被其他包访问
package model import "fmt" //定义一个结构体 //Name 首字母大写,表示其他包可以直接访问 //age和sal 首字母小写,其他包是不能访问的 type person struct { Name string age int sal float64 } //写一个工厂模式的函数,相当于构造函数 func NewPerson(name string) *person { return &person{ Name: name, } } //为了访问age和sal我们编写一对SetXxx的方法和GetXxx的方法 func (p *person) SetAge(age int) { if age > 0 && age < 150 { p.age = age } else { fmt.Println("年龄范围不正确...") } } //获取年龄的Get方法 func (p *person) GetAge() int { return p.age } //SetSal方法 func (p *person) SetSal(sal float64) { if sal >= 3000 && sal <= 5000 { p.sal = sal } else { fmt.Println("薪水范围不正确...") } } //GetSal方法 func (p *person) GetSal() float64 { return p.sal }
2)创建一个main的包,在包中创建一个main方法用于访问model中的结构体
package main import ( "fmt" "src/main/src/go_code/chapter04/demo10/model" ) func main() { p := model.NewPerson("ckfuture") p.SetAge(18) p.SetSal(5000) fmt.Println(p) fmt.Println(p.Name, "age = ", p.GetAge(), " sal = ", p.GetSal()) }
运行如图:
代码结构:
继承主要解决代码复用,让我们的编程更加靠近人类思维。
当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体,在改结构体中定义这些相同的属性和方法。
其他的结构体不需要重新定义这些属性和方法,只需要嵌套一个匿名结构体即可。
也就是说:在Golang中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。
嵌套匿名结构体的基本语法:
type Goods struct{ Name string Price int } type Book struct{ Goods//这里就是嵌套匿名结构体Goods Writer string }
原文:https://www.cnblogs.com/ckfuture/p/14858019.html