结构体的基本定义和使用
代码
package mainimport ( "io" "log" "os")// 定义一个结构体type Book struct { title string admin string price float64}// 传递一个 Book 副本func changBook1(v Book) { v.price = 10}// 传递一个 Book 指针func changBook2(v *Book) { v.price = 20.3}func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile) var book1 = Book{} book1.title = "Golang" book1.admin = "张三" book1.price = 30.5 log.Println(book1) log.Println("执行函数 changBook1") changBook1(book1) log.Println(book1) // price 没有被改变 log.Println("执行函数 changBook2") changBook2(&book1) log.Println(book1) // price 被改变了}
输出
main.go:38: {Golang 张三 30.5}main.go:40: 执行函数 changBook1main.go:42: {Golang 张三 30.5}main.go:44: 执行函数 changBook2main.go:46: {Golang 张三 20.3}
面向对象, 类的表示与封装
代码
package mainimport ( "io" "log" "os")// 如果类名首字母大写,表示其他包也能够访问type Hero struct { // /如果说类的属性首字母大写,表示该属性是对外能够访问的,否则的话只能够类的内部访问 name string sex string}// 在外部使用时获取主角名称func (t *Hero) GetNmae() string { name := t.name return name}// 主角唱歌方法, 传歌曲名// 方法名首字母大写,表示其他包也能够访问func (t *Hero) Singing(songName string) { log.Printf("%v开始唱%v\n", t.name, songName)}func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile) hero1 := Hero{name: "张三"} hero1.sex = "男" hero1.Singing("好日子") log.Println(hero1)}
输出
main.go:25: 张三开始唱好日子main.go:37: {张三 男}
使用反射获取结构体中的 tag 标签
代码
package mainimport ( "io" "log" "os" "reflect")type Resume struct { Name string `info:"name" doc:"我的名字"` Sex string `info:"sex"`}func findTag(str interface{}) { t := reflect.TypeOf(str).Elem() // log.Println(t) for i := 0; i < t.NumField(); i++ { tagInfo := t.Field(i).Tag.Get("info") tagDoc := t.Field(i).Tag.Get("info") log.Printf("tagInfo=%v, tagDoc=%v\n", tagInfo, tagDoc) }}func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile) my := Resume{"张三", "男"} log.Println(my) findTag(&my)}
输出
main.go:33: {张三 男}main.go:22: tagInfo=name, tagDoc=namemain.go:22: tagInfo=sex, tagDoc=sex
结构体标签在 JSON 中的应用
代码
package mainimport ( "bytes" "encoding/json" "io" "log" "os")type User struct { Name string `json:"name"` Sex int `json:"sex" doc:"0女1男"` Phone int64 `json:"phone" doc:"11位手机号"` Children []string `json:"children"`}func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile) u1 := User{} u1.Name = "母亲" u1.Sex = 0 u1.Phone = 13800138000 u1.Children = []string{"孩子1", "孩子2"} log.Println(u1) // JSON 编码过程, 结构体 --> josn jsonStr, err := json.Marshal(u1) if err == nil { log.Printf("jsonStr 数据类型 %T", jsonStr) log.Printf("jsonStr=%s\n", jsonStr) // 美化输出 var out bytes.Buffer json.Indent(&out, jsonStr, "", "\t") log.Printf("\n%v\n", out.String()) } else { log.Println("json 编码错误") } // 解码过程 jsonStr --> 结构体 jsonStr2 := `{"name":"母亲","sex":0,"phone":13800138000,"children":["孩子1","孩子2"]}` log.Printf("jsonStr=%s\n", jsonStr2) u2 := User{} err = json.Unmarshal([]byte(jsonStr2), &u2) if err == nil { log.Printf("jsonStr 数据类型 %T", u2) log.Printf("u2=%v\n", u2) } else { log.Println("json 解码错误") }}
输出
main.go:28: {母亲 0 13800138000 [孩子1 孩子2]}main.go:33: jsonStr 数据类型 []uint8main.go:34: jsonStr={"name":"母亲","sex":0,"phone":13800138000,"children":["孩子1","孩子2"]}main.go:39: { "name": "母亲", "sex": 0, "phone": 13800138000, "children": [ "孩子1", "孩子2" ]}main.go:46: jsonStr={"name":"母亲","sex":0,"phone":13800138000,"children":["孩子1","孩子2"]}main.go:51: jsonStr 数据类型 main.Usermain.go:52: u2={母亲 0 13800138000 [孩子1 孩子2]}