封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据 被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作。
二、实现封装1、将结构体、 字段(属性)的首字母小写(不能导出了,其它包不能使用,类似private)
2、给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数
3、提供一个首字母大写的Bet方法(类似其它语言的public),用于对属性判断并赋值
4、提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值
三、入门练习package person
import (
"fmt"
)
//定义一个结构体
type person struct {
Name string
age int
sal float64
}
//编写工厂模式函数
func NewPerson(name string) *person {
return &person{
Name: name,
}
}
//编写get和set方法
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 > 0 {
p.sal = sal
}else {
fmt.Println("请输入正确的薪水")
}
}
func (p *person) GetSal() float64 {
return p.sal
}
package main
import (
"fmt"
"go_code/project01/main/person"
)
func main() {
newPerson := person.NewPerson("老王")
newPerson.SetAge(10)
newPerson.SetSal(2000)
fmt.Println("年龄:",newPerson.GetAge(),"薪水:",newPerson.GetSal())
}
练习二
package account
import (
"fmt"
)
//定义一个结构体
type account struct {
accountNo string
pwd string
balance float64
}
//编写一个工厂模式
func NewAccount(accountNo string, pwd string, balance float64) *account {
if len(accountNo) < 6 || len(accountNo) > 10 {
fmt.Println("账户的长度不对")
return nil
}
if len(pwd) != 6 {
fmt.Println("账户密码格式不正确")
return nil
}
if balance < 20 {
fmt.Println("存入余额不足")
return nil
}
a := account{
accountNo: accountNo,
pwd: pwd,
balance: balance,
}
return &a
}
func (p *account) SetAccountNo(accountNo string) {
if len(accountNo) < 6 || len(accountNo) > 10 {
fmt.Println("账户的长度不对")
return
} else {
p.accountNo = accountNo
}
}
func (p *account) SetPwd(pwd string) {
if len(pwd) != 6 {
fmt.Println("账户密码格式不正确")
return
}else {
p.pwd = pwd
}
}
func (p *account) SetBalance(balance float64) {
if balance < 20 {
fmt.Println("存入余额不足")
return
}else {
p.balance = balance
}
}
//存款
func (account *account) Deposite(money float64,pwd string) {
//判断密码是否正确
if pwd != account.pwd {
fmt.Println("请输入正确的密码")
return
}
//判断输入金额是否合理
if money <= 0 {
fmt.Println("请输入正确的金额")
return
}
account.balance += money
fmt.Println("存款成功")
}
//取款
func (account *account) WithDraw(money float64,pwd string) {
//判断密码是否正确
if pwd != account.pwd {
fmt.Println("请输入正确的密码")
return
}
//判断输入金额是否合理
if money <= 0 || money > account.balance{
fmt.Println("请输入正确的金额")
return
}
account.balance -= money
fmt.Println("取款成功")
}
//查询余额
func (account *account) Query(pwd string) {
//判断密码是否正确
if pwd != account.pwd {
fmt.Println("请输入正确的密码")
return
}
fmt.Println("账户余额为:",account.balance)
}
package main
import (
"fmt"
"go_code/project01/main/account"
)
func main() {
newAccount := account.NewAccount("老王", "666666", 20)
if newAccount != nil {
fmt.Println("创建成功",newAccount)
} else {
fmt.Println("创建失败")
}
newAccount.SetAccountNo("5555555555555555")
fmt.Println(newAccount)
}



