GO结构体

package main

import (
	"fmt"
	"encoding/json"
)
type Point struct {
	x,y int
}
type Rect struct {
	leftUp,righDown Point
}

type A struct {
	Name string
}
type B struct {
	Name string
}
//tag的使用
type C struct {
	Name string `json:"name"`
	Age int `json:"age"`
}
//至关于给C取了别名,可是他们类型不同,能够强转
type D C

type TestStruct struct {
	Name string
	Age int
	Scores [5]float64
	Ptr *int //指针
	Slice []int //切片
	Map map[string]string //map
}
func main() {
	var ts TestStruct;
	ts.Name = "tang"
	ts.Age = 30
	ts.Scores = [5]float64{10.0, 11.0, 12.0, 13.0, 14.0}
	test := 1;
	ts.Ptr = &test
	ts.Slice = make([]int, 2, 5)
	ts.Map = make(map[string]string, 3)
	fmt.Println(ts)

	ts2 := TestStruct{"tang", 30, ts.Scores, &test, ts.Slice, ts.Map}
	fmt.Println(ts2)
	
	var ts3 *TestStruct = new(TestStruct)
	ts3.Name = "tang" //(*ts3).Name = "xxx"
	fmt.Println(*ts3)

	var ts4 *TestStruct = &TestStruct{"Tang", 18, ts.Scores, &test, ts.Slice, ts.Map}
	(*ts4).Name = "tang" //ts4.Name = "xxx" 
	fmt.Println(*ts4)

	//结构体元素 内存地址是连续的
	r1 := Rect{Point{1,2}, Point{3,4}}
	fmt.Printf("r1.leftUp.x %p\nr1.leftUp.y %p\nr1.righDown.x %p\nr1.righDown.y %p\n", 
	&r1.leftUp.x, &r1.leftUp.y, &r1.righDown.x, &r1.righDown.y)

	//两个结构体须要相互转换 结构体字段必需要彻底同样(名称,个数,类型)
	var a A
	var b B
	var c C
	var d D
	a = A(b)  //能够
	//a = A(c) //不行 
	fmt.Println(a)

	//结构体进行type从新定义(至关于别名),go认为是新的数据类型,可是相互之间能够强转
	//c = d //这是不正确的,他们类型不同
	c = C(d) //能够
	fmt.Println(c)

	c.Name = "test"
	c.Age = 10
	jsonstr,err := json.Marshal(c)
	if nil != err {
		fmt.Println("json错误", err)
	}
	fmt.Println(string(jsonstr)) //{"name":"test","age":10}
}
相关文章
相关标签/搜索