結構體所有字段在內存當中是連續(xù)的
type Point struct {
x, y int
}
type Rect struct {
left, up Point
}
func main() {
r := Rect{
left: Point{
x: 16,
y: 18,
},
up: Point{
x: 19,
y: 20,
},
}
fmt.Printf("%p,%p \n", &r.left, &r.up)
fmt.Printf("%p,%p,%p,%p", &r.left.x, &r.left.y, &r.up.x, &r.left.y)
}
0xc0000141a0,0xc0000141b0
0xc0000141a0,0xc0000141a8,0xc0000141b0,0xc0000141a8
?一個int類型剛好8個字節(jié)。可以看到結構體的字段在內存當中是連續(xù)分布的,通過地址的加減來找到對應的數(shù)據(jù)。
可以看到指針的地址也是連續(xù)的,r有兩個*point類型,這個兩個*Point類型的本身地址也是連續(xù)的,但是他們指向的地址不一定是連續(xù)。
結構體轉換
結構體是用戶單獨定義的類型,和其它類型進行轉換時需要有完全相同的字段(字段、個數(shù)和類型)?
type A struct{
Num int
}
type B struct{
Num int
}
func main(){
var a A
var b B
b=B(a)//這里正確嗎?
}
字段名稱,字段類型,字段個數(shù)都得一致才可以轉。?
tag 結構體標簽 結構體序列化
結構體字段是大寫的,這樣是為了能夠在別的包中使用。
序列化的概念就是將一個變量序列化為字符串然后再返回給客戶端。這個字符串有個通用的格式就是json,別人返回字段并不希望是大寫的,更加希望返回的json字段是小寫的。
這個時候就可以給結構體加上tag,在tag里面可以指定小寫的字段。這樣不僅僅可以在其他包中訪問你的字段,并且可以將你大寫的字段名改為希望的字段名稱。
在使用json包的Marshal方法的時候,相當于在別的包,也就是在別的包里面訪問結構體變量了。如果你的結構體變量是小寫的,那么根據(jù)作用域的原則,那么在json的Marshal方法里面是訪問不到這些小寫的變量的,無法序列化,因此只可以大寫。但是大寫序列化之后的結果是大寫,這樣就需要使用tag。文章來源:http://www.zghlxwxcb.cn/news/detail-672334.html
json的Marshal函數(shù)當中使用了反射。?文章來源地址http://www.zghlxwxcb.cn/news/detail-672334.html
- 字段大寫就可以序列化??
- tag序列化后小寫的字符串通過網(wǎng)絡返回給客戶端
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"username"`
Age int `json:"age"`
phone string `json:"phone"`
}
func main() {
p := &Person{
Name: "lucas",
Age: 29,
phone: "123456",
}
//將person序列化為json格式字符串
if data, err := json.Marshal(p); err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(string(data))
}
d, _ := json.Marshal(p)
var p1 Person
json.Unmarshal(d, &p1)
fmt.Printf("%#v", p1)
}
{"username":"lucas","age":29}
main.Person{Name:"lucas", Age:29, phone:""}
到了這里,關于Golang struct 結構體注意事項和使用細節(jié)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!