1. 程式人生 > 其它 >Go_03_結構體的一些筆記

Go_03_結構體的一些筆記

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"time"
)

type User struct {
	ID         int8      `json:"id"`
	isDelete   bool      // 通過首字母大小寫控制可見性
	CreateTime time.Time `json:"create_time"`
	UpdateTime time.Time `json:"update_time"`
}

type Hobby struct {
	Title string `json:"title"`
	Desc  string `json:"desc"`
	Level int8   `json:"level"`
}

// Person 定義結構體
type Person struct {
	User              // 匿名巢狀結構體
	Name      string  `json:"name"`
	City      string  `json:"city"`
	Age       int8    `json:"age"`
	HobbyList []Hobby `json:"hobby_list"`
}

func (p *Person) SetHobby(hobbyList []Hobby) {
	// 要先分配記憶體,才能拷貝過來
	p.HobbyList = make([]Hobby, len(hobbyList))
	copy(p.HobbyList, hobbyList)
}


// 實現 ToString 方法 值接收者
func (p Person) ToString() string {
	return fmt.Sprintf("%v", p)
}

func (p Person) ToJson() string {
	if result, err := json.Marshal(p); err == nil {
		return string(result)
	}
	return ""
}

// FromJson 覆蓋原來的值 指標接收者
func (p *Person) FromJson(bytes []byte) {
	err := json.Unmarshal(bytes, p)
	if err != nil {
		log.Println(err)
	}
}

// 軟刪除 Delete 指標接收者
func (p *Person) Delete() {
	p.isDelete = true
}

// 構造方法
func NewPerson(name, city string, age int8) *Person {
	return &Person{
		Name: name,
		City: city,
		Age:  age,
	}
}

func main() {
	person := NewPerson("lzh", "上饒", 27)
	person1 := NewPerson("lzh1", "上饒1", 21)
	log.Println(person.ToString())
	(*person).Delete()
	log.Println(person.ToJson())
	log.Println(person.ToString())

	result, _ := json.Marshal(person)
	log.Println(string(result))

	log.Println(person1.ToJson())
	person1.FromJson(result)
	log.Println(person1.ToJson())

	hobbyList := []Hobby{
		{"羽毛球", "羽毛球", 1},
		{"籃球", "籃球", 2},
	}

	person.SetHobby(hobbyList)
	//person.HobbyList = hobbyList
	hobbyList[1].Level = 9
	log.Println(person.ToJson())

}