Go_03_结构体的一些笔记

package main

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

var (
	once      sync.Once
	_instance *Person
)

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"`
}

// GetInstance 原子操作实现线程安全的单例
func GetInstance() *Person {
	once.Do(func() {
		_instance = new(Person)
	})
	return _instance
}

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())

	p2 := new(Person)
	p2.Age = 9
	log.Println(p2.HobbyList)
	nums := 10
	for nums > 0 {
		go func() {
			p := GetInstance()
			log.Printf("%p", p)
		}()
		nums--
	}
	time.Sleep(1 * time.Second)
}

原文地址:https://www.cnblogs.com/carp-li/p/15132266.html