很多时候,我们不应该把某包(如abc)中的struct(如animal)直接暴露给其它包,暴露意味着打开了那个"黑匣子",所以结构体一般会以小写字母开头,对于跨包代码(package声明不同)是隐藏的,不会被导出。
- 错误示例
结构体一般会以小写字母开头,在外界其它包中构建包abc的结构体animal,就没法直接通过以下几种方式实现:
var xxx abc.animal
new(abc.animal)
&abc.animal{...}
abc.animal{...}
abc/abc.go文件内容:
package abc
type animal struct{
name string
Speak string
}
main.go内容
package main
import "./abc"
func main() {
// 全都错误
var t1 abc.animal
t2 := new(abc.animal)
t3 := &abc.animal{}
t4 := abc.animal{}
}
- 正确导入其他包中的结构体
如何在外界构建隐藏结构体的实例?这时可以在abc包中写一个可导出的函数,其他包的代码可以通过这个函数,跨包来构建struct实例。例如:abc/abc.go文件内容
package abc
type animal struct{
name string // animal中的成员字段name不可导出
Speak string
}
func NewAnimal() *animal{ // 返回结构体animal实例的指针
a := new(animal)
return a
}
在main.go中,跨包引用隐藏的结构体animal
package main
import (
"fmt"
"./abc"
)
func main() {
t1 := abc.NewAnimal()
// t1.name = "haha"
t1.Speak = "hhhh"
fmt.Println(t1.Speak)
}
因为animal中的首字母小写成员字段name不可导出,无法访问隐藏成员字段name,没法为其赋值。换句话说,name属性永远是初始化值0。因此,在构建结构体实例时,需要自定义设置隐藏成员属性name,并且获取它的值。
- 参考文章
https://www.cnblogs.com/f-ck-need-u/p/9887233.html