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