У Golang есть три оператора точек (...), который выгружает каждый элемент среза в качестве собственного аргумента при использовании с вызовом функции, но похоже, что подобный механик не может быть использован с инициализатором структуры.Инициализация структуры с данными среза
Есть ли способ уменьшить беспорядок кода, не обращаясь к каждому элементу в срезе при инициализации структуры?
Можно ли добавить значение в инициализированную структуру по одному или получить доступ к некоторому индексу внутри цикла for?
(я полагаю, можно было бы получить доступ к прямому местоположению в памяти инициализируются структуры - но я бы предпочел не делать этого)
Следующими не работает: (ошибка синтаксиса)
type Stats struct {
Total uint64
ICMP uint64
UDP uint64
TCP uint64
FTP uint64
HTTP uint64
MAIL uint64
P2P uint64
}
func newStats(slice [][]byte) *Stats {
var tmp [8]uint64
var err error
for i, val := range slice {
tmp[i], err = strconv.ParseUint(string(val), 10, 32)
if err != nil {
// Handle error
}
}
return &Stats{tmp...} // Syntax error
}
Ни делает это: (конечно)
return &Stats{
for{ <code> }
}
Это работает, но я надеюсь на идиоматический, более быстрый способ, без синтаксической копировании
return &Stats{
tmp[0],
tmp[1],
tmp[2],
tmp[3],
tmp[4],
tmp[5],
tmp[6],
tmp[7],
}
Я думаю, что это может быть плохим подход. Что делать, если порядок полей меняется? Что делать, если поля добавляются/удаляются? Я предлагаю всегда использовать явный вид (т. Е. 'T {A: s [0], B: s [1],/* ... * /}'). –
Возможно, это так, и это невозможно в первую очередь. Это только заставило меня задуматься. – hiqluid