2015-08-05 4 views
0

Я новичок в Golang, и я пытаюсь инициализировать структуру структур со списком строк внизу. Я хотел бы иметь доступ к значениям внутри в чистом и читабельном виде, но это не щелчок.Чистое выполнение многоуровневой структуры структур в Go

, например, установка структура выглядит следующим образом:

type config struct { 
    // a config can have many replicas 
    configName string 
    replicas []string 
} 

type instance struct { 
    // an instance can have many configs 
    name string 
    configs []config 
} 

type user struct { 
    // a user can have up to two instances 
    instances []instance 
} 

И я инициализацией так:

var users = map[string][]user{ 
    "user-1": []user { 
    { 
     []instance { 
     { 
      "instance-1", 
      []config { 
      { 
       "some-config-1", 
       []string{"xx", "yy", "zz",}, 
      }, 
      }, 
     }, 
     }, 
    }, 
    }, 
    "user-2": { 
    { 
     []instance { 
     { 
      "instance-2", 
      []config { 
      { 
       "some-config-2", 
       []string{"xx", "yy", "zz",}, 
      }, 
      }, 
     }, 
     }, 
    }, 
    }, 
} 

Затем, чтобы получить доступ к любому из полей, я должен сделать валовой материал как:

func main() { 
    for user, _ := range users { 
    fmt.Println(users[user][0].instances[0].name) 
    } 
} 

Должен быть лучший способ? Пример использования (но грубый) кода здесь: http://play.golang.org/p/9M8pyBnMPB

+0

Просто выполните функции для инициализации вещей, то есть NewUser, NewInstance, NewConfig. – user3591723

ответ

0

Просто написать функции.

func NewInstance(n string, confs ...config) instance { 
    var i instance 
    i.name = n 
    i.configs = confs 
    return i 
} 

func NewConfig(name string, reps ...string) config { 
    var c config 
    c.configName = name 
    c.replicas = reps 
    return c 
} 

func NewUser(ins ...instance) user { 
    var u user 
    u.instances = ins 
    return u 
} 

Тогда это имеет тот же эффект, как ваш код:

var users map[string][]user 
func main() { 
    users = make(map[string][]user) 
    u1_i1 := NewInstance("instance-1", 
    NewConfig("conf1", "xx", "yy", "zz")) 

    users["user-1"] = []user{NewUser(u1_i1)} 

    u2_i1 := NewInstance("instance-2", 
    NewConfig("conf2", "xx", "yy", "zz", "aa")) 

    users["user-2"] = []user{NewUser(u2_i1)} 

    for user, _ := range users { 
     fmt.Println(users[user][0].instances[0].name) 
    } 
} 

http://play.golang.org/p/okmBapuDWj

Если доступ к вещам становится сложнее .. больше функций:

func (u user) InstanceName(i int) string { 
    return u.instances[i].name 
} 

или рассмотреть переделки вашего структуры данных.

Смежные вопросы