Golang笔记—面向对象编程

工厂模式

说明
Golang 的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。

看一个需求

一个结构体的声明是这样的:

package model
type Student struct { 
	Name string...
}

因为这里的 Student 的首字母 S 是大写的,如果我们想在其它包创建 Student 的实例(比如 main 包), 引入 model 包后,就可以直接创建 Student 结构体的变量(实例)。但是问题来了,如果首字母是小写的, 比如 是 type student struct {…} 就不不行了,怎么办—> 工厂模式来解决.

package model

type Student struct{
	Name string
	Score float64
}

package main
import (
		"fmt"
		"go_code/fatory/model"
)

func main() {
	var stu = model.Student{
		Name :"tom",
		Score : 78,
	} 

	fmt.Println(stu)
}

如果 model 包的 结构体变量首字母小写,引入后,不能直接使用, 可以工厂模式解决, 代码:
student.go

package model

type student struct{
	Name string
	Score float64
}

//student结构体小写,所以为是由

func NewStudent(n string, s float64) *student{
	return &student{
		Name : n,
		Score : s,
	}
}

main.go

package main
import (
		"fmt"
		"go_code/fatory/model"
)

func main() {
	// var stu = model.student{
	// 	Name :"tom",
	// 	Score : 78,
	// } 

	//当小写时
	var stu = model.NewStudent("tom~", 88)
	fmt.Println(*stu)
}

思考题
同学们思考一下,如果 model 包的 student 的结构体的字段 Score 改成 score,我们还能正常访问 吗?又应该如何解决这个问题呢?[老师给出思路,学员自己完成]

  • 解决方法如下:
package model

type student struct{
	Name string
	score float64
}

//student结构体小写,所以为是由

func NewStudent(n string, s float64) *student{
	return &student{
		Name : n,
		score : s,
	}
}

func (s *student) GetScore() float64{
	return s.score
}

package main
import (
		"fmt"
		"go_code/fatory/model"
)

func main() {
	// var stu = model.student{
	// 	Name :"tom",
	// 	Score : 78,
	// } 

	//当小写时
	var stu = model.NewStudent("tom~", 88)
	// fmt.Println(*stu)、
	fmt.Println(stu.Name, stu.GetScore())
}

面向对象编程思想-抽象

抽象的介绍

我们在前面去定义一个结构体时候,实际上就是把一类事物的共有的属性(字段)和行为(方法)提取 出来,形成一个物理模型(结构体)。这种研究问题的方法称为抽象。

在这里插入图片描述

package main
import (
"fmt"
)
//定义一个结构体 Account type Account struct {
AccountNo string Pwd string Balance float64
}


//方法
//1. 存款
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.Printf("你的账号为=%v  余额=%v \n", account.AccountNo, account.Balance)


}




func main() {


//测试一把
account := Account{ AccountNo : "gs1111111", Pwd : "666666",
Balance : 100.0,
}


//这里可以做的更加灵活,就是让用户通过控制台来输入命令...
//菜单.... account.Query("666666")
account.Query("666666") account.WithDraw(150.0, "666666") account.Query("666666")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩波的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值