Go 工厂模式详解

    技术2024-01-11  112

    工厂模式详解

    说明 Golang 的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。看一个需求 一个结构体的声明是这样的: package model type Student struct { Name string... } 因为这里的 Student 的首字母 S 是大写的,如果我们想在其它包创建 Student 的实例(比如 main 包),引入 model 包后,就可以直接创建 Student 结构体的变量(实例)。但是问题来了,如果首字母是小写的,比如 是 type student struct {....} 就不不行了,怎么办---> 工厂模式来解决.
    工厂模式来解决问题 使用工厂模式实现跨包创建结构体实例。如果 model 包的 结构体变量首字母大写,引入后,直接使用, 没有问题


    如果 model 包的 结构体变量首字母小写,引入后,不能直接使用, 可以工厂模式解决 model.go 文件中 package model //定义一个结构体 type student struct{ Name string Score float64 } //因为student结构体首字母是小写,因此是只能在model使用 //我们通过工厂模式来解决 func NewStudent(n string, s float64) *student { return &student{ Name : n, Score : s, } } main.go文件中 package main import ( "fmt" "go_code/chapter10/factory/model" ) func main() { //定student结构体是首字母小写,我们可以通过工厂模式来解决 var stu = model.NewStudent("tom", 98.8) fmt.Println(*stu) //&{....} fmt.Println("name=", stu.Name, " score=", stu.Score) } 输出结果;


    如果 model 包的 student 的结构体的字段 Score 改成 score,就不能正常访问了,又应该如何解决这个问题呢? -- 如果score字段首字母小写,则在其它包不可以直接方法,我们可以提供一个方法 func (s *student) GetScore() float64{ return s.score //ok } 在main.go中调用: fmt.Println("name=", stu.Name, " score=", stu.GetScore())

     

    Processed: 0.009, SQL: 10