simple_interface3.go 936 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // simple_interface2.go
  2. package main
  3. import (
  4. "fmt"
  5. )
  6. type Simpler interface {
  7. Get() int
  8. Set(int)
  9. }
  10. type Simple struct {
  11. i int
  12. }
  13. func (p *Simple) Get() int {
  14. return p.i
  15. }
  16. func (p *Simple) Set(u int) {
  17. p.i = u
  18. }
  19. type RSimple struct {
  20. i int
  21. j int
  22. }
  23. func (p *RSimple) Get() int {
  24. return p.j
  25. }
  26. func (p *RSimple) Set(u int) {
  27. p.j = u
  28. }
  29. func fI(it Simpler) int {
  30. switch it.(type) {
  31. case *Simple:
  32. it.Set(5)
  33. return it.Get()
  34. case *RSimple:
  35. it.Set(50)
  36. return it.Get()
  37. default:
  38. return 99
  39. }
  40. return 0
  41. }
  42. func gI(any interface{}) int {
  43. // return any.(Simpler).Get() // unsafe, runtime panic possible
  44. if v, ok := any.(Simpler); ok {
  45. return v.Get()
  46. }
  47. return 0 // default value
  48. }
  49. /* Output:
  50. 6
  51. 60
  52. */
  53. func main() {
  54. var s Simple = Simple{6}
  55. fmt.Println(gI(&s)) // &s is required because Get() is defined with a receiver type pointer
  56. var r RSimple = RSimple{60, 60}
  57. fmt.Println(gI(&r))
  58. }
  59. /* Output:
  60. 6
  61. 60
  62. */