去深/浅拷贝

时间:2015-07-01 12:50:37

标签: struct go deep-copy

我正在尝试在Go中复制一个结构,但却找不到很多资源。这就是我所拥有的:

type Server struct {
    HTTPRoot       string // Location of the current subdirectory
    StaticRoot     string // Folder containing static files for all domains
    Auth           Auth
    FormRecipients []string
    Router         *httprouter.Router
}

func (s *Server) Copy() (c *Server) {
    c.HTTPRoot = s.HTTPRoot
    c.StaticRoot = s.StaticRoot
    c.Auth = s.Auth
    c.FormRecipients = s.FormRecipients
    c.Router = s.Router
    return
}

第一个问题,这不是一个很深的副本,因为我没有复制s.Auth。这至少是一个正确的浅拷贝吗?第二个问题,是否有更惯用的方式来执行深(或浅)副本?

编辑:

我玩过的另一种选择非常简单,并使用参数按值传递的事实。

func (s *Server) Copy() (s2 *Server) {
    tmp := s
    s2 = &tmp
    return
}

这个版本更好吗? (这是正确的吗?)

1 个答案:

答案 0 :(得分:10)

作业副本。你的第二个功能很接近,你只需要取消引用s

这会将*Server s复制到c

c := new(Server)
*c = *s

对于深层复制,您需要遍历这些字段,并确定需要递归复制的内容。根据{{​​1}}的内容,如果它包含未导出字段中的数据,则可能无法进行深层复制。