结构的私有字段和方法

时间:2014-03-03 13:32:21

标签: go

在以下测试代码中,我希望将mytypedoPrivate方法都设为私有,这样只有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")
}

字段sizehash以及doPrivate方法应该被封装,其他类型不应该有权访问它们。

4 个答案:

答案 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)
}

https://play.golang.org/p/awjIIj8Kwms