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} }