Go 的 Structs 结构体
结构体 Struct
用来实现面向对象,类似于其他语言的类(class)
package main
import "fmt"
type TestStruct struct {
Name string `json:"name" xml:"name"`
// <属性名> <类型> <标签...>
isGood bool `json:"is_good" xml:"is_good"`
}
func main() {
testobj := TestStruct{}
testobj.Name = "hello" // 实例化
testobj.isGood = true
testobj2 := TestStruct{Name: "Hello", isGood: true} // 实例化
fmt.Println(testobj2.Name) // 获取属性
}
匿名构建一个结构体
package main
import "fmt"
func main() {
temp := struct {
Name string
Value string
}{
Name: "结构体",
Value: "匿名构建",
}
fmt.Println(temp.Name, temp.Value)
}
结构体的方法
一个简单的例子 为Test绑定 Print() 函数 调用时打印对象的Name属性:
package main
import "fmt"
type Test struct {
Name string
}
func (t *Test) Print() {
fmt.Println(t.Name)
}
func main() {
test := Test{Name: "hello world"}
test.Print()
}
嵌套结构体
package main
import "fmt"
type Person struct {
Name string
Gender int
Age int
}
type Master struct {
Person Person
salves []Slave
}
type Slave struct {
Person Person
Jobs []Job
}
type Job struct {
Name string
}
func main() {
p1 := Person{Name: "小明", Age: 38, Gender: 1}
p2 := Person{Name: "小帅", Age: 18, Gender: 1}
p3 := Person{Name: "小美", Age: 18, Gender: 0}
m1 := Master{Person: p1}
s1 := Slave{Person: p2, Jobs: []Job{{Name: "工作1"}, {Name: "工作2"}}}
s2 := Slave{Person: p3, Jobs: []Job{{Name: "工作3"}, {Name: "工作4"}}}
fmt.Println(m1, s1, s2)
}
匿名字段
不写字段名即是匿名字段 可以直接通过对象访问
package main
type Test struct {
string
int
}
func main() {
t := Test{}
t.string = "匿名字段"
t.int = 120
}
标签
结构体的标签用于序列号、反序列化、验证等左右,最常用的就是json标签
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
u1 := User{"小明", 35}
fmt.Println(u1.Name, u1.Age)
var u2 User
err := json.Unmarshal([]byte("{\"name\": \"小明\", \"age\": 35}"), &u2) // 使用Json字符串 反序列化一个 User 对象
if err != nil {
fmt.Println("反序列化错误", err.Error())
return
}
fmt.Println(u1) // {小明 35}
fmt.Println(u2) // {小明 35}
}
结构体比较
会比较对象属性是否相等
package main
import (
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
u1 := User{"小明", 35}
u2 := User{"小明", 35}
fmt.Println(u1 == u2)
}
评论