- package main
- import "fmt"
- // 结构体
- 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}}
- //r1 有四个 int, 在内存中是连续分布
- // 打印地址
- fmt.Printf("r1.leftUp.x 地址 =%p r1.leftUp.y 地址 =%p r1.rightDown.x 地址 =%p r1.rightDown.y 地址 =%p \n",
- &r1.leftUp.x, &r1.leftUp.y, &r1.rightDown.x, &r1.rightDown.y)
- //r2 有两个 *Point 类型, 这个两个 * Point 类型的本身地址也是连续的,
- // 但是他们指向的地址不一定是连续
- r2 := Rect2{&Point{10,20}, &Point{30,40}}
- // 打印地址
- fmt.Printf("r2.leftUp 本身地址 =%p r2.rightDown 本身地址 =%p \n",
- &r2.leftUp, &r2.rightDown)
- // 他们指向的地址不一定是连续..., 这个要看系统在运行时是如何分配
- fmt.Printf("r2.leftUp 指向地址 =%p r2.rightDown 指向地址 =%p \n",
- r2.leftUp, r2.rightDown)
- }
- package main
- import "fmt"
- import "encoding/json"
- 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)
- }
- package main
- import "fmt"
- import "encoding/json"
- type Monster struct {
- Name string `json:"name"` //`json:"name"` 就是 struct tag
- Age int `json:"age"`
- Skill string `json:"skill"`
- }
- func main() {
- //1. 创建一个 Monster 变量
- monster := Monster{"牛魔王", 500, "芭蕉扇~"}
- //2. 将 monster 变量序列化为 JSON 格式字串
- //JSON.Marshal 函数中使用反射, 这个讲解反射时, 会详细介绍
- // 如果字段变成小写, JSON 包就不能访问到字段的值, 大写的话很多程序员不习惯, 所以使用 tag
- jsonStr, err := JSON.Marshal(monster)
- if err != nil {
- fmt.Println("json 处理错误", err)
- }
- fmt.Println("jsonStr", string(jsonStr)) //jsonStr {"name":"牛魔王","age":500,"skill":"芭蕉扇~"}
- }
来源: http://www.bubuko.com/infodetail-3393714.html