结构体的基本定义和使用
代码
package main
import (
"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: 执行函数 changBook1
main.go:42: {Golang 张三 30.5}
main.go:44: 执行函数 changBook2
main.go:46: {Golang 张三 20.3}
面向对象, 类的表示与封装
代码
package main
import (
"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 main
import (
"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=name
main.go:22: tagInfo=sex, tagDoc=sex
结构体标签在 JSON 中的应用
代码
package main
import (
"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 数据类型 []uint8
main.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.User
main.go:52: u2={母亲 0 13800138000 [孩子1 孩子2]}