通常当我看到在结构上声明的字段没有指针或解除引用的指针符号*时,但是在几个代码片段中,我在结构中看到了一个数据库字段。 s,如下所示,指针取消引用。为什么这有必要?
type DB struct {
*bolt.DB
}
func Open(path string, mode os.FileMode) (*DB, error) {
db, err := bolt.Open(path, mode)
if err != nil {
return nil, err
}
return &DB{db}, nil
}
答案 0 :(得分:2)
或解除引用的指针符号*
对于复杂的非价值类型,这是常态,以避免复制 有关包含指针的struct的示例,请参阅Golang book "Pointers"。
return &DB{db}
返回指向新创建的DB
实例的指针
如" Can you “pin” an object in memory with Go?"中所述:
请注意,与C不同,返回局部变量的地址是完全可以的。与函数关联的存储在函数返回后仍然存活
来自" Pointer/Value Subtleties":
Go也是按值传递的,但它同时包含指针和值类型。指针指的是某个内存位置,允许您改变该位置的数据
有关详情,请参阅" Best practice “returning” structs in Go?"
使用大型结构或结构的指针,你必须改变,否则使用值,因为通过指针让事情突然改变是令人困惑的。