通过值或指针访问另一个结构

use*_*368 6 struct pointers go

当您通过值或指针访问另一个结构时有什么区别?
什么时候应该使用它们?

type foo_ struct {
    st uint8
    nd uint8
}

type bar struct {
    rd  uint8
    foo foo_
}

type barP struct {
    rd  uint8
    foo *foo_
}
Run Code Online (Sandbox Code Playgroud)

pet*_*rSO 5

如果声明或分配变量type bar,则保留并初始化为两个rd uint8和的内存为零foo foo_.总是有一个type foo_嵌入变量的变量type bar.

var b bar  // declare b
Run Code Online (Sandbox Code Playgroud)

如果声明或分配变量type barP,则保留并初始化为两个rd uint8和的内存为零foo *foo_.零值指针是nil指针.没有type foo_分配变量; 你必须分开做.有一个零(foo == nil)或一个type foo_由变量指向的变量type barP.变量of type barP可以指向与type foo_其他变量相同的变量type barP,共享变量的相同副本type foo_.所有指向它的变量都会看到对共享副本的更改.

var bp barP         // declare bp
bp.foo = new(foo_)  // allocate bp.foo
Run Code Online (Sandbox Code Playgroud)

使用哪一个取决于type bar对比的属性type barP.哪种类型更能反映出您试图解决的问题?

例如,请考虑此发票问题.我们总是有账单地址; 我们总是要求我们的钱.但是,我们经常发送到帐单邮寄地址,但并非总是如此.如果是送货地址nil,请使用帐单邮寄地址.否则,请使用单独的送货地址.我们有两个仓库,我们总是从一个或另一个出货.我们可以共享两个仓库位置.由于我们在订单从仓库发货之前不发送发票,因此仓库位置永远不会nil.

type address struct {
    street string
    city   string
}

type warehouse struct {
    address string
}

type invoice struct {
    name      string
    billing   address
    shipping  *address
    warehouse *warehouse
}
Run Code Online (Sandbox Code Playgroud)