Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.3k views
in Technique[技术] by (71.8m points)

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

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

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

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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 访问闭包里面的变量。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...