在以下测试代码中,我希望将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")
}
字段size
和hash
以及doPrivate
方法应该被封装,其他类型不应该有权访问它们。
答案 0 :(得分:47)
在Go中,以大写字母开头的标识符将从包中导出,并且可以由声明它的包外的任何人访问。
如果标识符以小写字母开头,则只能从包中访问。
如果您需要某个类型的成员只能由该类型的成员访问,那么您需要将该类型及其成员函数放在一个单独的包中,作为该包中唯一的类型。
答案 1 :(得分:41)
这并不是“隐私”在Go中的运作方式:隐私的粒度就是包。
如果确实只希望mytype
的成员访问某些字段,那么您必须将结构和函数隔离在自己的包中。
但这不是通常的做法。 Go是否是OOP是值得商榷的,但很明显,这种做法不是通过你似乎想要做的结构来封装代码。通常,程序包足够小,可以保持一致:如果您不想访问程序包中的字段,请不要访问它们。
答案 2 :(得分:8)
你不能在Go中这样做。可见性仅适用于每个包级别。但是你可以将你的包分成两部分。
答案 3 :(得分:1)
您可以使用希望公开的方法创建一个接口,并且仅在将对象包装到该接口后才能访问该对象。
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)
}