Nếu bạn khai báo hoặc phân bổ biến số type bar
, bạn đặt trước và khởi tạo bộ nhớ bằng không cho cả rd uint8
và foo foo_
. Luôn có một biến số type foo_
được nhúng trong biến số type bar
.
var b bar // declare b
Nếu bạn khai báo hoặc phân bổ một biến type barP
, bạn dự trữ và khởi tạo vào bộ nhớ zero cho cả rd uint8
và foo *foo_
. Con trỏ giá trị bằng không là con trỏ nil
. Không có biến nào của type foo_
được phân bổ; bạn phải làm điều đó một cách riêng biệt. Có một số không (foo == nil
) hoặc một biến số type foo_
được trỏ đến bởi một biến số type barP
. Biến số type barP
có thể trỏ đến cùng một biến số type foo_
dưới dạng các biến số khác của type barP
, chia sẻ cùng một bản sao của biến số type foo_
. Một thay đổi đối với một bản sao được chia sẻ được nhìn thấy bởi tất cả các biến trỏ đến nó.
var bp barP // declare bp
bp.foo = new(foo_) // allocate bp.foo
Mà một trong những sử dụng phụ thuộc vào các tính chất của type bar
so type barP
. Loại nào phản ánh chặt chẽ hơn vấn đề mà bạn đang cố giải quyết?
Ví dụ: xem xét vấn đề hóa đơn này. Chúng tôi luôn có địa chỉ thanh toán; chúng tôi luôn đòi tiền của chúng tôi. Tuy nhiên, chúng tôi thường gửi đến địa chỉ thanh toán, nhưng không phải lúc nào. Nếu địa chỉ giao hàng là nil
, hãy sử dụng địa chỉ thanh toán. Nếu không, hãy sử dụng địa chỉ giao hàng riêng. Chúng tôi có hai nhà kho, và chúng tôi luôn luôn vận chuyển từ một hoặc khác. Chúng tôi có thể chia sẻ hai địa điểm kho. Vì chúng tôi không gửi hóa đơn cho đến khi đơn đặt hàng được gửi từ nhà kho, vị trí nhà kho sẽ không bao giờ là nil
.
type address struct {
street string
city string
}
type warehouse struct {
address string
}
type invoice struct {
name string
billing address
shipping *address
warehouse *warehouse
}
Khi biến 'loại barP' được khai báo hoặc cấp phát, giá trị ban đầu của foo sẽ là con trỏ' nil'. – peterSO