1、结构体的所有字段在内存
中是连续的。
案例一
//定义结构体
type Point struct {
x int
y int
}
//矩形节构体
type Rect struct {
leftUp, rightDown Point
}
func main() {
r1 := Rect{Point{1, 2}, Point{3, 4}}
fmt.Printf("r1.leftUp.x=%p\nr1.leftUp.y=%p\nr1.rightDown.x=%p\nr1.rightDown.y=%p\n",
&r1.leftUp.x, &r1.leftUp.y, &r1.rightDown.x, &r1.rightDown.y)
}
r2有两个 Point类型,这两个Point类型的本身地址是连续的,但它们指向的地址不一定是连续的
//定义结构体
type Point struct {
x int
y int
}
//矩形节构体
type Rect struct {
leftUp, rightDown Point
}
type Rect2 struct {
leftUp, rightDown *Point
}
func main() {
r1 := Rect{Point{1, 2}, Point{3, 4}}
fmt.Printf("r1.leftUp.x=%p\nr1.leftUp.y=%p\nr1.rightDown.x=%p\nr1.rightDown.y=%p\n",
&r1.leftUp.x, &r1.leftUp.y, &r1.rightDown.x, &r1.rightDown.y)
r2 := Rect2{&Point{10, 20}, &Point{30, 40}}
fmt.Println()
fmt.Printf("r2.leftUp本身地址%p\nr2.rightDown本身地址%p\n", &r2.leftUp, &r2.rightDown)
fmt.Println(r2)
}
2、两个结构体类型转换
的时候,两个必须有完全相同的字段名称、个数和类型
//定义结构体
type A struct {
Num int
}
type B struct {
Num int
}
func main() {
var a A
var b B
a = A(b)
fmt.Println(a, b)
}
3、结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型。但是相互间可以强转
//定义结构体
type Student struct {
Name string
Age int
}
type Stu Student
func main() {
//Student 和Stu是两个不同的数据类型
var stu1 Student
var stu2 Stu
//数据类型转换
stu2 = Stu(stu1)
fmt.Println(stu1, stu2)
type interger int //给int取别名为interger
var i interger = 10
var j int = 20
//数据类型转换
j = int(i)
fmt.Println(i, j)
}
4、struct
的每个字段上,可以写上一个tag
,该tag
可以通过反射机制
获取
,常见的使用场景是序列化和反序列化。
package main
import (
"encoding/json"
"fmt"
_ "sort"
)
//定义结构体
type Monster struct {
Name string `json:"name"` // `json:"name"` 这个部分就是结构体的tag
Age int `json:"age"`
Skill string `json:"skill"`
}
func main() {
//1、创建一个Monster变量
monster := Monster{"牛魔王", 500, "牛头拳"}
//2、将monster变量序列化为 json格式的字符串
//json.Marshal()底层用到了反射
jsonStr, err := json.Marshal(monster)
if err != nil {
fmt.Println("json处理错误", err)
}
fmt.Println("jsonStr = ", string(jsonStr))
}
网友评论