package main
import (
"bufio"
"fmt"
"os"
"reflect"
"regexp"
"strings"
)
type Profile struct {
mine MyProfile "My datas"
yours YourProfile "Your datas"
}
type MyProfile struct {
Name string
Email string
Phone string
Occupation []string
Language []string
Hobby []string
}
type YourProfile struct {
Name string
Gender string
}
func NewProfile(arr map[string]map[string]interface{}) *Profile {
return &Profile{
mine: SetProfile(MyProfile{}, arr["me"]).(MyProfile),
yours: SetProfile(YourProfile{}, arr["you"]).(YourProfile),
}
}
type M interface {
ShowMessage() string
}
func (p *Profile) ShowMessage() string {
return fmt.Sprintf("Hi, %s. \nName: %s \nLanguage: %s", p.yours.Name, p.mine.Name,
strings.Join(p.mine.Language, ", "))
}
func SetProfile(p interface{}, arr map[string]interface{}) interface{} {
pst := reflect.New(reflect.TypeOf(p))
for k, v := range arr {
key := pst.Elem().FieldByName(k)
if key.IsValid() && key.CanSet() {
key.Set(reflect.ValueOf(v))
}
}
return pst.Elem().Interface()
}
func ArrangeAnswer(ans string) string {
re := regexp.MustCompile(`(\s| )+`)
return strings.TrimSpace(re.ReplaceAllString(ans, " "))
}
func main() {
prof := make(map[string]map[string]interface{})
prof["me"] = map[string]interface{}{
"Name": "John Lennon",
"Email": "foobar@gmail.com",
"Phone": "+81-90-0000-0000",
"Occupation": []string{"Programmer", "System Engineer"},
"Language": []string{"Go", "Java", "Python", "PHP", "JavaScript", "C"},
}
prof["you"] = make(map[string]interface{})
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("Would you please let me know your profile?")
for {
fmt.Print("Your name: ")
scanner.Scan()
ans := ArrangeAnswer(scanner.Text())
re := regexp.MustCompile(`^[a-zA-Z ]+$`)
if re.MatchString(ans) {
prof["you"]["Name"] = ans
break
} else {
fmt.Println("alphabet please.")
}
}
fmt.Print("Your gender: ")
scanner.Scan()
prof["you"]["Gender"] = strings.ToLower(ArrangeAnswer(scanner.Text()))
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "Read error: ", err)
}
p := NewProfile(prof)
fmt.Println(p.ShowMessage())
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImJ1ZmlvIgoJImZtdCIKCSJvcyIKCSJyZWZsZWN0IgoJInJlZ2V4cCIKCSJzdHJpbmdzIgopCgp0eXBlIFByb2ZpbGUgc3RydWN0IHsKCW1pbmUgIE15UHJvZmlsZSAgICJNeSBkYXRhcyIKCXlvdXJzIFlvdXJQcm9maWxlICJZb3VyIGRhdGFzIgp9Cgp0eXBlIE15UHJvZmlsZSBzdHJ1Y3QgewoJTmFtZSAgICAgICBzdHJpbmcKCUVtYWlsICAgICAgc3RyaW5nCglQaG9uZSAgICAgIHN0cmluZwoJT2NjdXBhdGlvbiBbXXN0cmluZwoJTGFuZ3VhZ2UgICBbXXN0cmluZwoJSG9iYnkgICAgICBbXXN0cmluZwp9Cgp0eXBlIFlvdXJQcm9maWxlIHN0cnVjdCB7CglOYW1lICAgc3RyaW5nCglHZW5kZXIgc3RyaW5nCn0KCmZ1bmMgTmV3UHJvZmlsZShhcnIgbWFwW3N0cmluZ11tYXBbc3RyaW5nXWludGVyZmFjZXt9KSAqUHJvZmlsZSB7CglyZXR1cm4gJlByb2ZpbGV7CgkJbWluZTogIFNldFByb2ZpbGUoTXlQcm9maWxle30sIGFyclsibWUiXSkuKE15UHJvZmlsZSksCgkJeW91cnM6IFNldFByb2ZpbGUoWW91clByb2ZpbGV7fSwgYXJyWyJ5b3UiXSkuKFlvdXJQcm9maWxlKSwKCX0KfQoKdHlwZSBNIGludGVyZmFjZSB7CglTaG93TWVzc2FnZSgpIHN0cmluZwp9CgpmdW5jIChwICpQcm9maWxlKSBTaG93TWVzc2FnZSgpIHN0cmluZyB7CglyZXR1cm4gZm10LlNwcmludGYoIkhpLCAlcy4gXG5OYW1lOiAlcyBcbkxhbmd1YWdlOiAlcyIsIHAueW91cnMuTmFtZSwgcC5taW5lLk5hbWUsCgkJc3RyaW5ncy5Kb2luKHAubWluZS5MYW5ndWFnZSwgIiwgIikpCn0KCmZ1bmMgU2V0UHJvZmlsZShwIGludGVyZmFjZXt9LCBhcnIgbWFwW3N0cmluZ11pbnRlcmZhY2V7fSkgaW50ZXJmYWNle30gewoJcHN0IDo9IHJlZmxlY3QuTmV3KHJlZmxlY3QuVHlwZU9mKHApKQoJZm9yIGssIHYgOj0gcmFuZ2UgYXJyIHsKCQlrZXkgOj0gcHN0LkVsZW0oKS5GaWVsZEJ5TmFtZShrKQoJCWlmIGtleS5Jc1ZhbGlkKCkgJiYga2V5LkNhblNldCgpIHsKCQkJa2V5LlNldChyZWZsZWN0LlZhbHVlT2YodikpCgkJfQoJfQoJcmV0dXJuIHBzdC5FbGVtKCkuSW50ZXJmYWNlKCkKfQoKZnVuYyBBcnJhbmdlQW5zd2VyKGFucyBzdHJpbmcpIHN0cmluZyB7CglyZSA6PSByZWdleHAuTXVzdENvbXBpbGUoYChcc3zjgIApK2ApCglyZXR1cm4gc3RyaW5ncy5UcmltU3BhY2UocmUuUmVwbGFjZUFsbFN0cmluZyhhbnMsICIgIikpCn0KCmZ1bmMgbWFpbigpIHsKCXByb2YgOj0gbWFrZShtYXBbc3RyaW5nXW1hcFtzdHJpbmddaW50ZXJmYWNle30pCgoJcHJvZlsibWUiXSA9IG1hcFtzdHJpbmddaW50ZXJmYWNle317CgkJIk5hbWUiOiAgICAgICAiSm9obiBMZW5ub24iLAoJCSJFbWFpbCI6ICAgICAgImZvb2JhckBnbWFpbC5jb20iLAoJCSJQaG9uZSI6ICAgICAgIis4MS05MC0wMDAwLTAwMDAiLAoJCSJPY2N1cGF0aW9uIjogW11zdHJpbmd7IlByb2dyYW1tZXIiLCAiU3lzdGVtIEVuZ2luZWVyIn0sCgkJIkxhbmd1YWdlIjogICBbXXN0cmluZ3siR28iLCAiSmF2YSIsICJQeXRob24iLCAiUEhQIiwgIkphdmFTY3JpcHQiLCAiQyJ9LAoJfQoJcHJvZlsieW91Il0gPSBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pCgoJc2Nhbm5lciA6PSBidWZpby5OZXdTY2FubmVyKG9zLlN0ZGluKQoJZm10LlByaW50bG4oIldvdWxkIHlvdSBwbGVhc2UgbGV0IG1lIGtub3cgeW91ciBwcm9maWxlPyIpCglmb3IgewoJCWZtdC5QcmludCgiWW91ciBuYW1lOiAiKQoJCXNjYW5uZXIuU2NhbigpCgkJYW5zIDo9IEFycmFuZ2VBbnN3ZXIoc2Nhbm5lci5UZXh0KCkpCgkJcmUgOj0gcmVnZXhwLk11c3RDb21waWxlKGBeW2EtekEtWiBdKyRgKQoJCWlmIHJlLk1hdGNoU3RyaW5nKGFucykgewoJCQlwcm9mWyJ5b3UiXVsiTmFtZSJdID0gYW5zCgkJCWJyZWFrCgkJfSBlbHNlIHsKCQkJZm10LlByaW50bG4oImFscGhhYmV0IHBsZWFzZS4iKQoJCX0KCX0KCWZtdC5QcmludCgiWW91ciBnZW5kZXI6ICIpCglzY2FubmVyLlNjYW4oKQoJcHJvZlsieW91Il1bIkdlbmRlciJdID0gc3RyaW5ncy5Ub0xvd2VyKEFycmFuZ2VBbnN3ZXIoc2Nhbm5lci5UZXh0KCkpKQoJaWYgZXJyIDo9IHNjYW5uZXIuRXJyKCk7IGVyciAhPSBuaWwgewoJCWZtdC5GcHJpbnRsbihvcy5TdGRlcnIsICJSZWFkIGVycm9yOiAiLCBlcnIpCgl9CgoJcCA6PSBOZXdQcm9maWxlKHByb2YpCglmbXQuUHJpbnRsbihwLlNob3dNZXNzYWdlKCkpCn0K