0
点赞
收藏
分享

微信扫一扫

Go 结构体 封装 工厂模式


面向对象特征,继承,封装,多态。在go中是使用技巧来实现这三个特征。

封装-工厂模式

  • golang的结构体没有构造函数(比如get set函数去设置你的结构体属性),通常可以使用工厂模式来解决这个问题。(当我去跨包使用的时候,虽然结构体尽量大写,但是有些时候需要作为私密的变量,我不想让其跨包使用,那么变量名称就小写,但是有些时候跨包还是想拿到这个东西,那么就可以封装一个方法)
  • 如果包里面的结构体变量首字母小写,引入后,不能直接使用,可以工厂模式解决(封装成方法,通过方法跨包调用)。
  • 只关心结果,不关心实现过程,因为过程是由封闭的工厂来实现的(能不能get set,不关心中间做了什么,不关系作用域,不关心大写小写)

package demo

//定义一个结构体
type student struct{
Name string
score float64
}

//*student返回结构体的指针,new函数是函数,不是方法,不需要添加接收器,通过包名点出来就行了
func NewStudent(name string, score float64) *student {
//外包引用不了,但本包是可以引用的
stu := student{
Name : name,
score : score,
}
return &stu
}

//接收器能够使用指针类型尽量使用指针类型
//结构体中的score字段也是小写所以需要写一个方法返回(get和结构体走,那么不能使用函数,使用方法)
func (s *student) GetScore() float64 {
return s.score
}

//使用方法和结构体绑定
func (s *student) SetScore(score float64) {
s.score = score
}

func main() {
s := demo.NewStudent("Tony", 60.5)
fmt.Println(s)
fmt.Println(s.GetScore())
s.SetScore(80)
fmt.Println(s)
//&{Tony 60.5}
//60.5
//&{Tony 80}
}

工厂函数

工厂函数一般用于创建自定义的结构体,便于使用者调用,我们还是以 person 类型为例,用如下代码进行定义:

func NewPerson(name string) *person {
return &person{name:name}
}

我定义了一个工厂函数 NewPerson,它接收一个 string 类型的参数,用于表示这个人的名字,同时返回一个*person。

通过工厂函数创建自定义结构体的方式,可以让调用者不用太关注结构体内部的字段,只需要给工厂函数传参就可以了。

用下面的代码,即可创建一个*person 类型的变量 p1:

p1:=NewPerson("张三")

工厂函数也可以用来创建一个接口,它的好处就是可以隐藏内部具体类型的实现,让调用者只需关注接口的使用即可。

总结就是结构体有些东西是隐秘的,但是只有在我的包里面能改,但是跨包看可以控制其权限范围,提供比如set方法,只关心结果就行了。

举报

相关推荐

0 条评论