golang的结构体没有 构造函数,通常可以使用工厂模式来解决这个问题
使用场景,当使用结构体时,结构体名称首字母是小写时,外部就无法引用
此时就可以用工厂模式来解决
案例:
在model包里定义一个结构体首字母大写
package model
//定义一个结构体
type Student struct{
Name string
Scoute float64
}
在main包里引用
package main
import(
"fmt"
"go_code/project01/object/demo7/model"
)
func main(){
stu := model.Student{
Name :"tom",
Scoute : 36.5,
}
fmt.Println(stu)//结果{tom 36.5}
}
但当model包里的结构体首字母改为小写时,main包就无法引用了
解决方式:
package model
//定义一个结构体
type student struct{
Name string
Scoute float64
}
//*student返回结构体的指针
func GetStudent(n string,s float64) *student {
//外包引用不了,但本包是可以引用的
stu := student{
Name : n,
Scoute : s,
}
return &stu
}
package main
import(
"fmt"
"go_code/project01/object/demo7/model"
)
func main(){
stu := model.GetStudent("tom",88.8)
fmt.Println(stu) //结果&{tom 88.8}
fmt.Println(*stu) //结果{tom 88.8}
fmt.Println("name = ",stu.Name," stoute = ",stu.Scoute) //结果name = tom stoute = 88.8
}
案例:
如果结构体里面的字段也是首字母小写 解决方式
package model
//定义一个结构体
type student struct{
Name string
scoute float64
}
//*student返回结构体的指针
func GetStudent(n string,s float64) *student {
//外包引用不了,但本包是可以引用的
stu := student{
Name : n,
scoute : s,
}
return &stu
}
//结构体中的scoute字段也是小写所以需要写一个方法返回
func (s *student) GetScoute() float64{
return s.scoute
}
package main
import(
"fmt"
"go_code/project01/object/demo7/model"
)
func main(){
stu := model.GetStudent("tom",99.8)
fmt.Println("name = ",stu.Name," stoute = ",stu.GetScoute()) //结果name = tom stoute = 99.8
}