持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第41天,点击查看活动详情
说明
Golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题
说明时候需要工厂模式
当结构体的名字是小写开头,需要在别的包创建结构体实例
使用工厂模式跨包创建结构体实例
当model包中的结构体的名字首字母是小写时,可以使用工厂模式
model.student包内容
package model
// 定义结构体
type Student struct {
Name string
Score float64
}
type student struct {
Name string
Score float64
}
// 因为student结构体首字母小写,只能在model中使用
// 通过工厂模式,进行解决
func NewStudent(n string, s float64) *student {
return &student{
Name: n,
Score: s,
}
}
main包内容
package main
import (
"fmt"
"go_code/chapter27-struct/factoryModel/model"
)
func main() {
// 创建一个 Student实例
stu := model.Student{"阿里", 88.88}
// student.go = {阿里 88.88}
fmt.Println("Student = ", stu)
// 当 student结构体首字母小写,可以如下使用
stuLow := model.NewStudent("小阿里", 44.44)
// student factory = {小阿里 44.44}
fmt.Println("student factory = ", *stuLow)
// name = 小阿里
fmt.Println("name = ", stuLow.Name)
}
当结构体中的字段首字母小写,不可以直接访问
可以提供一个方法来解决
model包
package model
// 定义结构体
type Student struct {
Name string
Score float64
}
type student struct {
Name string
score float64
}
// 因为student结构体首字母小写,只能在model中使用
// 通过工厂模式,进行解决
func NewStudent(n string, s float64) *student {
return &student{
Name: n,
score: s,
}
}
// 使用一个方法解决
func (s *student) GetScore() float64 {
return s.score // 此处到底是值拷贝还是地址拷贝,取决于 student是否加 *
}
main包
package main
import (
"fmt"
"go_code/chapter27-struct/factoryModel/model"
)
func main() {
// 创建一个 Student实例
stu := model.Student{"阿里", 88.88}
// student.go = {阿里 88.88}
fmt.Println("Student = ", stu)
// 当 student结构体首字母小写,可以如下使用
stuLow := model.NewStudent("小阿里", 44.44)
// student factory = {小阿里 44.44}
fmt.Println("student factory = ", *stuLow)
// name = 小阿里
fmt.Println("name = ", stuLow.Name)
// 访问首字母小写字段
//score = 44.44
fmt.Println("score = ", stuLow.GetScore()) // 这里还是使用指针来调用方法,只不过go底层有优化,*stuLow.GetScore 等同于 stuLow.GetScore
}