go所谓的工厂模式其实就是: 包内一个不可直接实例的结构体(结构体名称首字母小写),包外不可直接实例,那么为了解决这个问题,就写一个包外可调用的函数,通过这个函数实现返回结构体对象。
例如: 创建两个包,main、 model, main包中要获取model包的实例,并使用。实现方法如下:
src/test/main/main.go
src/test/model/model.go
1.main.go代码
package main
import (
"fmt"
"test/model"
)
func main() {
p := model.CreatePerson("tom",18)
age := p.GetAge()
fmt.Println(*p)
fmt.Println(p.Name)
fmt.Println(age)
}
2.model.go代码
package model
type person struct {
Name string
age int
}
//CreatePerson 工厂方法
func CreatePerson(n string,a int) *person {
p := person{Name:n,age:a}
return &p
}
func (p *person)GetAge() int {
return p.age
}
注意:
1.工厂方法名首字母大写,返回的是 结构体实例的指针(值引用,外包操作的都将会是同一份数据)
2.结构体内的字段名是首字母小写的话,那么包外不能直接访问,需要通过 绑定的方法来获取,绑定的是结构体指针,因为包外要操作的对象需要用的是同一份数据。
3.包外获取到的 对象是指针类型的,那么调用这个对象按正常逻辑应该是 (*p).Name ,但是go官方对于对象的底层,已经优化了指针类型的对象调方法或字段的方式,可以直接p.Name 和p.GetAge()