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}
}
相關文章
相關標籤/搜索