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