标签:amp 构造函数 ack turn 理解 etag 程序 imp main
如何理解抽象
? 我们在之前定义一个结构体时候,实际上就是把一类事物的共有的属性(字段)和行为()方法提出来,形成一个物理模型(结构体),这种研究问题的方法成为抽象。
代码实现
package main
import (
"fmt"
)
// 定义一个结构体Account
type Account struct {
AccountNo string
Pwd string
Blance float64
}
// 方法:
// 1、存款
func (account *Account) Deposite(money float64, pwd string) {
//看看输入的密码正确与否
if pwd != account.Pwd {
fmt.Println("你输入的密码不正确")
return
}
// 看看存款金额是否正确
if money <= 0 {
fmt.Println("你输入的金额不正确")
return
}
account.Blance += money
fmt.Println("存款成功")
}
// 2、取款
func (account *Account) WithDraw(money float64, pwd string) {
//看看输入的密码正确与否
if pwd != account.Pwd {
fmt.Println("你输入的密码不正确")
return
}
// 看看取款金额是否正确
if money <= 0 || money > account.Blance {
fmt.Println("你输入的金额不正确")
return
}
account.Blance -= money
fmt.Println("取款成功")
}
// 3、查询
func (account *Account) Query(pwd string) {
//看看输入的密码正确与否
if pwd != account.Pwd {
fmt.Println("你输入的密码不正确")
return
}
fmt.Printf("你的账号为=%v 余额为=%v\n",account.AccountNo, account.Blance)
}
func main() {
// 测试
account := Account{
AccountNo : "gs1111",
Pwd : "66",
Blance : 100.0,
}
for {
// 这里可以做的更加灵活,就是让用户通过控制台输入命令
// 菜单......
account.Query("66")
account.Deposite(200.0, "66")
account.Query("66")
account.WithDraw(150.0, "66")
account.Query("66")
}
}
? 封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作(方法),才能对字段进行操作。
将结构体、字段(属性)的首字母小写(不能导出了,其他包不能使用,类似private)
给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数
提供一个首字母大写的Set方法(类似其他语言public),用于对属性判断并赋值
func (var 结构体类型名) SetXxx(参数列表)(返回值列表) {
// 加入数据验证的 业务逻辑
var.字段 = 参数
}
提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值
func (var 结构体类型名) GetXxx() {
return var字段;
}
特别说明:在Golang开发中并没用特别强调封装,这点不想java,Golang本身对面向对象的特性做了简化的。
? 看一个程序person.go,不能祟拜你查看人的年龄,工资的等隐私,并对输入的年龄进行合理的验证
person.go
package model
import (
"fmt"
)
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("年龄范围不对...")
}
}
func (p *person) GetAge() int{
return p.age
}
// 设置薪水
func (p *person) SetSal(sal float64) {
if sal >= 3000 && sal < 30000 {
p.sal = sal
} else {
fmt.Println("薪水范围不对...")
}
}
func (p *person) GetSal() float64 {
return p.sal
}
main.go
package main
import (
"fmt"
"go_code/factory/model"
)
func main() {
p := model.NewPerson("smith")
p.SetAge(18)
p.SetSal(3000)
fmt.Println(p)
fmt.Println(p.Name, "age=", p.GetAge(), "sal=", p.GetSal())
}
运行main.go文件
标签:amp 构造函数 ack turn 理解 etag 程序 imp main
原文地址:https://www.cnblogs.com/jiaxiaozia/p/13069264.html