作者:HaigLee
https://www.jianshu.com/u/67ec21fb270d
本文由 HaigLee 发布。未经许可,禁止转载。
1. 说明
Golang 的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。
2. 需求示例
一个结构体的声明:
package model
type Student struct{
Name string ...
}
因为这里的Student 的首字母S是大写的,如果我们想在其它包括创建Student 的实例(比如main包),引入model 包后,就可以直接创建Student 结构体的变量(实例)。但是问题来了,如果首字母是小写的,比如是:
type student struct{
...
}
那么直接使用就不行了,这时候该怎么办呢?
使用工厂模式来解决!
3. 工厂模式解决的问题
- 使用工厂模式实现挎包创建结构体实例(变量)的案例:
1)如果model 包的结构体变量首字母大写,引入后,直接使用,没有问题;
例如:
model包代码:
package model
// 定义一个结构体
type Student struct{
Name string
Score float64
}
main包代码:
package main
import (
"fmt"
"xxx/xx..xx/xxx/model" // src 下目录名称
)
func main(){
var str = model.Student{
Name : "tom",
Score: "66.6",
}
fmt.Println(stu)
}
- 如果model 包的结构体变量首字母小写,引入后,不能直接使用,可以使用工厂模式解决:
model包代码:
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包代码:
package main
import (
"fmt"
"xxx/xx..xx/xxx/model" // src 下目录名称
)
func main(){
var stu = model.NewStudent("tom~", 88.8) // 返回的也是指针
fmt.Println(stu)// &(.......)
fmt.Println(*stu)// 返回值
fmt.Println(stu.Score)// 这个编译器可以做(*stu) 默认处理。
}
- 如果结构体中score 字段首字母小写,那么,在其他包不可以直接使用该字段,我们可以通过提供一个方法来解决。
model包代码:
package model
// 定义一个结构体
type Student struct{
Name string
score float64
}
// 因为student 结构体首字母是小写,因此是只能在model 使用
// 我们通过工厂模式来解决
func NewStudent(n string, s float64) *student{
return &student{
Name : n,
score : s,
}
}
//获取score 方法
func (s *student) GetScore() float64{
// return (*s).score
return s.score
}
main包代码:
package main
import (
"fmt"
"xxx/xx..xx/xxx/model" // src 下目录名称
)
func main(){
var stu = model.NewStudent("tom~", 88.8) // 返回的也是指针
fmt.Println(stu)// &(.......)
fmt.Println(*stu)// 返回值
fmt.Println(stu.GetScore())// 这个编译器可以做(*stu) 默认处理。
}
作者:HaigLee
https://www.jianshu.com/u/67ec21fb270d
本文由 HaigLee 发布。未经许可,禁止转载。
有疑问加站长微信联系(非本文作者)