fork download
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. "reflect"
  8. "regexp"
  9. "strings"
  10. )
  11.  
  12. type Profile struct {
  13. Mine MyProfile "My datas"
  14. Yours YourProfile "Your datas"
  15. }
  16.  
  17. type MyProfile struct {
  18. Name string
  19. Email string
  20. Phone string
  21. Occupation []string
  22. Language []string
  23. Hobby []string
  24. }
  25.  
  26. type YourProfile struct {
  27. Name string
  28. Gender string
  29. }
  30.  
  31. func (u *YourProfile) SetProfile(arr map[string]string) {
  32. for k, v := range arr {
  33. key := reflect.ValueOf(u).Elem().FieldByName(k)
  34. if key.IsValid() {
  35. key.SetString(v)
  36. }
  37. }
  38. }
  39.  
  40. type Message interface {
  41. ShowMessage() string
  42. }
  43.  
  44. func (m *MyProfile) ShowMessage(arr map[string]string) string {
  45. var u YourProfile
  46. u.SetProfile(arr) // ★
  47. return fmt.Sprintf("Hi, %s. \nName: %s \nLanguage: %s", u.Name, m.Name,
  48. strings.Join(m.Language, ", "))
  49. }
  50.  
  51. func ArrangeAnswer(ans string) string {
  52. re := regexp.MustCompile(`(\s| )+`)
  53. return strings.TrimSpace(re.ReplaceAllString(ans, " "))
  54. }
  55.  
  56. func main() {
  57. me := &MyProfile{
  58. Name: "John Lennon",
  59. Email: "foobar@gmail.com",
  60. Phone: "+81-90-0000-0000",
  61. Occupation: []string{"Programmer", "System Engineer"},
  62. Language: []string{"Go", "Java", "Python", "PHP", "JavaScript", "C"},
  63. }
  64. you := make(map[string]string)
  65.  
  66. scanner := bufio.NewScanner(os.Stdin)
  67. fmt.Println("Would you please let me know your profile?")
  68. for {
  69. fmt.Print("Your name: ")
  70. scanner.Scan()
  71. ans := ArrangeAnswer(scanner.Text())
  72. re := regexp.MustCompile(`^[a-zA-Z ]+$`)
  73. if re.MatchString(ans) {
  74. you["Name"] = ans
  75. break
  76. } else {
  77. fmt.Println("alphabet please.")
  78. }
  79. }
  80. fmt.Print("Your gender: ")
  81. scanner.Scan()
  82. you["Gender"] = strings.ToLower(ArrangeAnswer(scanner.Text()))
  83. if err := scanner.Err(); err != nil {
  84. fmt.Fprintln(os.Stderr, "Read error: ", err)
  85. }
  86.  
  87.  
  88. fmt.Println(me.ShowMessage(you))
  89. }
  90.  
Success #stdin #stdout 0s 790016KB
stdin
Tom York
male
stdout
Would you please let me know your profile?
Your name: Your gender: Hi, Tom York. 
Name: John Lennon 
Language: Go, Java, Python, PHP, JavaScript, C