关于 golang 的一个变量设计问题

刚入 golang,最近在写一个 http server。

我这里有一个全局的字符串类型的变量,它是线程安全的,所以我给了它一个互斥锁,同时新增了 Get/Set 函数来操作它,当然这两个函数也是线程安全的。为了防止后来者误用,我希望这个变量不要被直接使用,或者不要费事像下面这样用,

ProjectNameMutex.Lock()
defer ProjectNameMutex.Unlock()
ProjectName = name

我更希望他直接调用我提供的线程安全函数 GetProjectName(),那么这个变量我如何“隐藏”呢?

我在注释里对这个变量做了说明,但我觉得这不够,需要在设计上给一个方法,希望有了解的大兄弟指点一下。

阅读 2.7k
3 个回答

你可以用闭包把你的变量隐藏起来

func NewProjectName() (func() string, func(string)) {
    var ProjectName string
    getProjectName := func() string {
        return ProjectName
    }
    setProjectName := func(name string) {
        ProjectName = name
    }

    return getProjectName, setProjectName
}

func main() {
    getProjectName, setProjectName := NewProjectName()
    setProjectName("hello")
    var str = getProjectName()
    fmt.Println(str)
}

只能通过 getProjectName, setProjectName 访问闭包里面的变量。

改成 projectNameMutex, projectName ,小写字母开始不会导出,包外访问不到。

golang语法中,首字母大小写就是导出不导出的语法。所以你要么换成小写开头,要么就导出函数。这是语法限制。

推荐问题