package main
import (
"fmt"
"sync"
"sync/atomic"
"unsafe"
)
type User struct {
Name string `json:"name"`
}
func main() {
user := new(User)
user.Name = "mawar atomic"
userPtr := unsafe.Pointer(user)
userChan := make(chan string, 1)
userChan <- "mawar chan"
userGen := "mawar general"
wg := new(sync.WaitGroup)
wg.Add(2)
go func() {
defer wg.Done()
user = &User{Name: "suparman"}
atomic.StorePointer(&userPtr, unsafe.Pointer(user))
userChan <- "safira"
userGen = "amarta"
}()
go func() {
defer wg.Done()
loadUserPtr := atomic.LoadPointer(&userPtr)
user := (*User)(loadUserPtr)
fmt.Println("Before Value Ptr: ", user.Name)
fmt.Println("Before Value Chan: ", <-userChan)
usg := userGen
fmt.Println("Before Value Gen: ", usg)
fmt.Print("\n")
}()
wg.Wait()
userPtr = atomic.LoadPointer(&userPtr)
user = (*User)(userPtr)
fmt.Println("After Value Ptr: ", user.Name)
fmt.Println("After Value Chan: ", <-userChan)
fmt.Println("After Value Gen: ", userGen)
}