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")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Golang 是一门支持面向接口编程的语言,这意味着在 Golang 中,我们可以通过定义接口来实现多态性。具体来说,我们可以定义一个接口类型,然后让多个不同的类型实现该接口,从而使它们可以被视为同一类型,从而实现多态性。 在 Golang 中,接口是一组方法的集合,这些方法定义了该接口所代表的对象应该具有的行为。任何类型只要实现了该接口中定义的所有方法,就可以被视为该接口类型的实例。 下面是一个简单的例子,展示了如何定义一个接口和实现该接口: ```go package main import "fmt" // 定义一个接口 type Animal interface { Speak() string } // 定义一个结构体类型 type Dog struct { Name string } // 实现 Animal 接口中的 Speak 方法 func (d Dog) Speak() string { return "Woof!" } func main() { // 创建一个 Dog 类型的实例 d := Dog{Name: "Fido"} // 将该实例赋值给 Animal 类型的变量 var a Animal = d // 调用 Animal 接口中的 Speak 方法 fmt.Println(a.Speak()) // 输出: Woof! } ``` 在上面的例子中,我们定义了一个 Animal 接口,它只有一个方法:Speak。然后我们定义了一个 Dog 结构体类型,并实现了 Animal 接口中的 Speak 方法。最后,我们创建了一个 Dog 类型的实例,并将其赋值给 Animal 类型的变量。由于 Dog 类型实现了 Animal 接口中的所有方法,所以它可以被视为 Animal 类型的实例,从而实现了多态性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浩波的笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值