Go入门之struct
类型别名
var b myFloat = 12.3
fmt.Printf("%f,%T", b, b)
结构体为值类型
初始化
type Person struct {
name string
age int
sex string
}
func main() {
var p1 Person
p1.name = "张三"
p1.sex = "男"
p1.age = 20
fmt.Printf("%v,%T\n", p1, p1)
fmt.Printf("%#v,%T\n", p1, p1)
}
结构体首字母大写表示是公有的,小写表示是私有的
第二种
var p2 = new(Person)
fmt.Printf("%v,%T\n", p2, p2)
第三种
var p3 = &Person{}
fmt.Printf("%v,%T\n", p3, p3)
第四种
var p4 = Person{
name: "哈哈",
age: 20,
sex: "nan",
}
fmt.Printf("%v,%T\n", p4, p4)
第五种
var p5 = &Person{
name: "哈哈",
age: 20,
sex: "nan",
}
fmt.Printf("%v,%T\n", p5, p5)
第六种初始化可以不赋值,为默认值
结构体自定义方法
type Person struct {
name string
age int
sex string
}
func (p Person) PrintInfo() {
fmt.Printf("%v,%v", p.name, p.age)
}
func main() {
var p1 = Person{
name: "张三",
age: 20,
sex: "男",
}
p1.PrintInfo()
}
自定义类型定义方法
type MyInt int
func (m MyInt) PrintInfo() {
fmt.Println("int")
}
不能给其他包的类型定义方法
匿名结构体
type student struct {
string
int
}
func main() {
p := student{
"张三",
20,
}
fmt.Println(p)
}
type Address struct {
Phone string
City string
}
type Person struct {
Name string
Age int
Hobby []string
map1 map[string]string
addr Address
}
func main() {
var p Person
p.Name = "张三"
p.Age = 20
p.Hobby = make([]string, 3, 6)
p.Hobby[0] = "写代码"
p.Hobby[1] = "睡觉"
p.map1 = make(map[string]string)
p.map1["address"] = "北京"
p.addr.City = "北京"
p.addr.Phone = "12312"
fmt.Println(p)
}
匿名字段在嵌套结构体中的应用,如果当前找不到就向匿名嵌套结构体中寻找
type Address struct {
Phone string
City string
}
type Person struct {
Name string
Age int
Hobby []string
map1 map[string]string
Address
}
func main() {
var p Person
p.Name = "张三"
p.Age = 20
p.Hobby = make([]string, 3, 6)
p.Hobby[0] = "写代码"
p.Hobby[1] = "睡觉"
p.map1 = make(map[string]string)
p.map1["address"] = "北京"
p.City = "北京"
p.Phone = "12312"
fmt.Println(p)
}
通过结构体嵌套来继承结构体及其方法,当前没有方法,去嵌套结构体找
type Student struct {
ID int
Gender string
Name string
Sno string
}
func main() {
var s1 = Student{
ID: 12,
Gender: "男",
Name: "李四",
Sno: "123",
}
jsonByte, _ := json.Marshal(s1)
jsonStr := string(jsonByte)
fmt.Printf("%v", jsonStr)
}
结构体转换成json对象,变量必须为大写,表示公有字段
json对象转结构体
type Student struct {
ID int
Gender string
Name string
Sno string
}
func main() {
var str = `{"ID":12,"Gender":"男","Name":"李四","Sno":"123"}`
var s1 Student
err := json.Unmarshal([]byte(str), &s1)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%#v\n", s1)
}
结构体标签:转换完自动变成该变量
type Student struct {
ID int `json:"id"`
Gender string `json:"gender"`
Name string `json:"name"`
Sno string `json:"sno"`
}
type Student struct {
ID int `json:"id"`
Gender string `json:"gender"`
Name string `json:"name"`
}
type Class struct {
Title string
Students []Student
}
func main() {
c := Class{
Title: "001班",
Students: make([]Student, 0),
}
for i := 0; i <= 10; i++ {
s := Student{
ID: i,
Gender: "男",
Name: fmt.Sprintf("std_%v", i),
}
c.Students = append(c.Students, s)
}
fmt.Println(c)
strByte, err := json.Marshal(c)
if err != nil {
fmt.Println(err)
} else {
strJson := string(strByte)
fmt.Println(strJson)
}
}
var str = `{"Title":"001班","Students":[{"id":0,"gender":"男","name":"std_0"},{"id":1,"gender":"男","name":"std_1"},{"id":2,"gender":"男","name":"std_2"},{"id":3,"gender":"男","name":"std_3"},{"id":4,"gender":"男","name":"std_4"},{"id":5,"gender":"男","name":"std_5"},{"id":6,"gender":"男","name":"std_6"},{"id":7,"gender":"男","name":"std_7"},{"id":8,"gender":"男","name":"std_8"},{"id":9,"gender":"男","name":"std_9"},{"id":10,"gender":"男","name":"std_10"}]}`
var cc = &Class{}
errr := json.Unmarshal([]byte(str), cc)
if errr != nil {
fmt.Println(errr)
} else {
fmt.Printf("%#v", cc)
}