首页 > 解决方案 > 为什么取消引用只是为了在 Go 中再次引用

问题描述

里面有gorilla/sessions以下代码

func (s *CookieStore) New(r *http.Request, name string) (*Session, error) {
    session := NewSession(s, name)
    opts := *s.Options
    session.Options = &opts
    ...

哪里s.Options是类型*sessions.Options

type CookieStore struct {
    ...
    Options *Options // default configuration
}

并且sessios.Session.Options也是类型*sessions.Options

type Session struct {
    ...
    Options *Options
    ...
}

我的问题是,取消引用s.Options然后将其引用分配给 有什么意义session.Options?为什么不这样做:

func (s *CookieStore) New(r *http.Request, name string) (*Session, error) {
    session := NewSession(s, name)
    session.Options = s.Options
    ...

这是为了确保将取消引用的值s.Options复制到session.Options,而不是实际的引用,从而避免两个对象指向同一事物?

标签: gogorilla

解决方案


就是防止两个指针指向同一个位置。

session := NewSession(s, name)
opts := *s.Options

此时,opts包含s.Options. 然后:

session.Options = &opts

这将设置session.Options为一个不同于 的选项对象s.Options,但其内容是从 初始化的s.Options


推荐阅读