conc_access.go 987 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // conc_access.go
  2. package main
  3. import (
  4. "fmt"
  5. "strconv"
  6. )
  7. type Person struct {
  8. Name string
  9. salary float64
  10. chF chan func()
  11. }
  12. func NewPerson(name string, salary float64) *Person {
  13. p := &Person{name, salary, make(chan func())}
  14. go p.backend()
  15. return p
  16. }
  17. func (p *Person) backend() {
  18. for f := range p.chF {
  19. f()
  20. }
  21. }
  22. // Set salary.
  23. func (p *Person) SetSalary(sal float64) {
  24. p.chF <- func() { p.salary = sal }
  25. }
  26. // Retrieve salary.
  27. func (p *Person) Salary() float64 {
  28. fChan := make(chan float64)
  29. p.chF <- func() { fChan <- p.salary }
  30. return <-fChan
  31. }
  32. func (p *Person) String() string {
  33. return "Person - name is: " + p.Name + " - salary is: " + strconv.FormatFloat(p.Salary(), 'f', 2, 64)
  34. }
  35. func main() {
  36. bs := NewPerson("Smith Bill", 2500.5)
  37. fmt.Println(bs)
  38. bs.SetSalary(4000.25)
  39. fmt.Println("Salary changed:")
  40. fmt.Println(bs)
  41. }
  42. /* Output:
  43. Person - name is: Smith Bill - salary is: 2500.50
  44. Salary changed:
  45. Person - name is: Smith Bill - salary is: 4000.25
  46. */