在下面的测试代码中,我希望将两者mytype
和doPrivate
方法都设置为私有,以便只有成员mytype
可以访问它,而不是mypackage
包的范围内的其他类型\函数.
我可以在golang中这样做吗?
package mypackage
type mytype struct {
size string
hash uint32
}
func (r *mytype) doPrivate() string {
return r.size
}
func (r *mytype) Do() string {
return doPrivate("dsdsd")
}
Run Code Online (Sandbox Code Playgroud)
田size
和hash
以及该doPrivate
方法应该被封装并没有其他类型应有权访问它们.
nos*_*nos 54
在Go中,以大写字母开头的标识符从包中导出,并且可以由声明它的包外的任何人访问.
如果标识符以小写字母开头,则只能从包中访问.
如果您需要类型中的成员只能由该类型的成员访问,则需要将该类型及其成员函数放在单独的包中,作为该包中的唯一类型.
Den*_*ret 44
这并不是Go中"隐私"的工作原理:隐私的粒度就是包.
如果您真的只mytype
想要访问某些字段的成员,那么您必须将结构和函数隔离在它们自己的包中.
但这不是通常的做法.Go是否是OOP是值得商榷的,但很明显,这种做法不是通过你似乎想要做的结构来封装代码.通常,程序包足够小,可以保持一致:如果您不想访问程序包中的字段,请不要访问它们.
Far*_*d T 16
您可以使用您希望公开的方法创建一个接口,并且仅在包装到该接口中时才访问该对象。
package main
type mytype struct {
size string
hash uint32
}
// interface for exposed methods
type myinterface interface {
do() string
}
// constructor (optional)
func newMytype(size string, hash uint32) myinterface {
return &mytype{size, hash}
}
func (r *mytype) doPrivate() string {
return r.size
}
func (r *mytype) do() string {
return r.doPrivate()
}
func main() {
// with constructor
t := newMytype("100", 100)
t.do()
// t.doPrivate() // t.doPrivate undefined (type myinterface has no field or method doPrivate)
// without constructor
t2:= myinterface(&mytype{"100", 100})
t2.do()
// t.doPrivate() // t.doPrivate undefined (type myinterface has no field or method doPrivate)doPrivate)
}
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/awjIIj8Kwms
在一个模块中可以有任意数量的包。
公共/私有仅适用于一个包。
所有公共字段、方法和函数均以大写字符开头。
所有私有字段、方法和函数均以小写字符开头。
要将包添加到模块或程序中,只需创建一个小写文件夹并将包名称添加到其中的所有文件即可。这是一个例子。
./main.go
./foo/foo.go
./foo/MyStruct.go
Run Code Online (Sandbox Code Playgroud)
文件./foo/foo.go
:
./main.go
./foo/foo.go
./foo/MyStruct.go
Run Code Online (Sandbox Code Playgroud)
文件./foo/MyStruct.go
:
package foo
import "fmt"
func SomePublicFuncInFoo() {
somePrivateFuncInFoo()
}
func somePrivateFuncInFoo() {
fmt.Println("somePrivateFuncInFoo call")
}
Run Code Online (Sandbox Code Playgroud)
文件./main.go
:
package foo
import "fmt"
type MyStruct struct {
MyPublicField string // starts with uppercase char
myPrivateField string // starts with lowercase char
}
func NewMyStruct(publicField string, privateField string) *MyStruct {
return &MyStruct{
MyPublicField: publicField,
myPrivateField: privateField,
}
}
func (self *MyStruct) SomePublicMethod() {
self.privateMethod()
}
func (self *MyStruct) privateMethod() {
fmt.Println("MyStruct", self.MyPublicField, self.myPrivateField)
}
Run Code Online (Sandbox Code Playgroud)