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(arr["me"]), // ★ ここをどうすればいいのかサッパリ分かりません
yours: SetProfile(arr["you"]), // ★
}
}
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 (p *Profile) SetProfile(arr map[string]interface{}) {
for k, v := range arr {
key := reflect.ValueOf(p).Elem().FieldByName(k)
if key.IsValid() {
key.SetString(v.(string))
}
}
}
func (m *MyProfile) SetProfile(arr map[string]interface{}) {
for k, v := range arr {
key := reflect.ValueOf(m).Elem().FieldByName(k)
if key.IsValid() {
key.SetString(v.(string))
}
}
}
func (u *YourProfile) SetProfile(arr map[string]string) {
for k, v := range arr {
key := reflect.ValueOf(u).Elem().FieldByName(k)
if key.IsValid() {
key.SetString(v)
}
}
}
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"},
}
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())
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImJ1ZmlvIgoJImZtdCIKCSJvcyIKCSJyZWZsZWN0IgoJInJlZ2V4cCIKCSJzdHJpbmdzIgopCgp0eXBlIFByb2ZpbGUgc3RydWN0IHsKCW1pbmUgIE15UHJvZmlsZSAgICJNeSBkYXRhcyIKCXlvdXJzIFlvdXJQcm9maWxlICJZb3VyIGRhdGFzIgp9Cgp0eXBlIE15UHJvZmlsZSBzdHJ1Y3QgewoJbmFtZSAgICAgICBzdHJpbmcKCWVtYWlsICAgICAgc3RyaW5nCglwaG9uZSAgICAgIHN0cmluZwoJb2NjdXBhdGlvbiBbXXN0cmluZwoJbGFuZ3VhZ2UgICBbXXN0cmluZwoJaG9iYnkgICAgICBbXXN0cmluZwp9Cgp0eXBlIFlvdXJQcm9maWxlIHN0cnVjdCB7CgluYW1lICAgc3RyaW5nCglnZW5kZXIgc3RyaW5nCn0KCmZ1bmMgTmV3UHJvZmlsZShhcnIgbWFwW3N0cmluZ11tYXBbc3RyaW5nXWludGVyZmFjZXt9KSAqUHJvZmlsZSB7CglyZXR1cm4gJlByb2ZpbGV7CgkJbWluZTogIFNldFByb2ZpbGUoYXJyWyJtZSJdKSwgIC8vIOKYhSDjgZPjgZPjgpLjganjgYbjgZnjgozjgbDjgYTjgYTjga7jgYvjgrXjg4Pjg5Hjg6rliIbjgYvjgorjgb7jgZvjgpMKCQl5b3VyczogU2V0UHJvZmlsZShhcnJbInlvdSJdKSwgIC8vIOKYhQoJfQp9Cgp0eXBlIE0gaW50ZXJmYWNlIHsKCVNob3dNZXNzYWdlKCkgc3RyaW5nCn0KCmZ1bmMgKHAgKlByb2ZpbGUpIFNob3dNZXNzYWdlKCkgc3RyaW5nIHsKCXJldHVybiBmbXQuU3ByaW50ZigiSGksICVzLiBcbk5hbWU6ICVzIFxuTGFuZ3VhZ2U6ICVzIiwgcC55b3Vycy5uYW1lLCBwLm1pbmUubmFtZSwKCQlzdHJpbmdzLkpvaW4ocC5taW5lLmxhbmd1YWdlLCAiLCAiKSkKfQoKZnVuYyAocCAqUHJvZmlsZSkgU2V0UHJvZmlsZShhcnIgbWFwW3N0cmluZ11pbnRlcmZhY2V7fSkgewoJZm9yIGssIHYgOj0gcmFuZ2UgYXJyIHsKCQlrZXkgOj0gcmVmbGVjdC5WYWx1ZU9mKHApLkVsZW0oKS5GaWVsZEJ5TmFtZShrKQoJCWlmIGtleS5Jc1ZhbGlkKCkgewoJCQlrZXkuU2V0U3RyaW5nKHYuKHN0cmluZykpCgkJfQoJfQp9CgpmdW5jIChtICpNeVByb2ZpbGUpIFNldFByb2ZpbGUoYXJyIG1hcFtzdHJpbmddaW50ZXJmYWNle30pIHsKCWZvciBrLCB2IDo9IHJhbmdlIGFyciB7CgkJa2V5IDo9IHJlZmxlY3QuVmFsdWVPZihtKS5FbGVtKCkuRmllbGRCeU5hbWUoaykKCQlpZiBrZXkuSXNWYWxpZCgpIHsKCQkJa2V5LlNldFN0cmluZyh2LihzdHJpbmcpKQoJCX0KCX0KfQoKZnVuYyAodSAqWW91clByb2ZpbGUpIFNldFByb2ZpbGUoYXJyIG1hcFtzdHJpbmddc3RyaW5nKSB7Cglmb3IgaywgdiA6PSByYW5nZSBhcnIgewoJCWtleSA6PSByZWZsZWN0LlZhbHVlT2YodSkuRWxlbSgpLkZpZWxkQnlOYW1lKGspCgkJaWYga2V5LklzVmFsaWQoKSB7CgkJCWtleS5TZXRTdHJpbmcodikKCQl9Cgl9Cn0KCmZ1bmMgQXJyYW5nZUFuc3dlcihhbnMgc3RyaW5nKSBzdHJpbmcgewoJcmUgOj0gcmVnZXhwLk11c3RDb21waWxlKGAoXHN844CAKStgKQoJcmV0dXJuIHN0cmluZ3MuVHJpbVNwYWNlKHJlLlJlcGxhY2VBbGxTdHJpbmcoYW5zLCAiICIpKQp9CgpmdW5jIG1haW4oKSB7Cglwcm9mIDo9IG1ha2UobWFwW3N0cmluZ11tYXBbc3RyaW5nXWludGVyZmFjZXt9KQoKCXByb2ZbIm1lIl0gPSBtYXBbc3RyaW5nXWludGVyZmFjZXt9ewoJCSJuYW1lIjogICAgICAgIkpvaG4gTGVubm9uIiwKCQkiZW1haWwiOiAgICAgICJmb29iYXJAZ21haWwuY29tIiwKCQkicGhvbmUiOiAgICAgICIrODEtOTAtMDAwMC0wMDAwIiwKCQkib2NjdXBhdGlvbiI6IFtdc3RyaW5neyJQcm9ncmFtbWVyIiwgIlN5c3RlbSBFbmdpbmVlciJ9LAoJCSJsYW5ndWFnZSI6IFtdc3RyaW5neyJHbyIsICJKYXZhIiwgIlB5dGhvbiIsICJQSFAiLCAiSmF2YVNjcmlwdCIsICJDIn0sCgl9CgoJc2Nhbm5lciA6PSBidWZpby5OZXdTY2FubmVyKG9zLlN0ZGluKQoJZm10LlByaW50bG4oIldvdWxkIHlvdSBwbGVhc2UgbGV0IG1lIGtub3cgeW91ciBwcm9maWxlPyIpCglmb3IgewoJCWZtdC5QcmludCgiWW91ciBuYW1lOiAiKQoJCXNjYW5uZXIuU2NhbigpCgkJYW5zIDo9IEFycmFuZ2VBbnN3ZXIoc2Nhbm5lci5UZXh0KCkpCgkJcmUgOj0gcmVnZXhwLk11c3RDb21waWxlKGBeW2EtekEtWiBdKyRgKQoJCWlmIHJlLk1hdGNoU3RyaW5nKGFucykgewoJCQlwcm9mWyJ5b3UiXVsibmFtZSJdID0gYW5zCgkJCWJyZWFrCgkJfSBlbHNlIHsKCQkJZm10LlByaW50bG4oImFscGhhYmV0IHBsZWFzZS4iKQoJCX0KCX0KCWZtdC5QcmludCgiWW91ciBnZW5kZXI6ICIpCglzY2FubmVyLlNjYW4oKQoJcHJvZlsieW91Il1bImdlbmRlciJdID0gc3RyaW5ncy5Ub0xvd2VyKEFycmFuZ2VBbnN3ZXIoc2Nhbm5lci5UZXh0KCkpKQoJaWYgZXJyIDo9IHNjYW5uZXIuRXJyKCk7IGVyciAhPSBuaWwgewoJCWZtdC5GcHJpbnRsbihvcy5TdGRlcnIsICJSZWFkIGVycm9yOiAiLCBlcnIpCgl9CgoJcCA6PSBOZXdQcm9maWxlKHByb2YpCglmbXQuUHJpbnRsbihwLlNob3dNZXNzYWdlKCkpCn0K