Serhioromano
@Serhioromano
Web Developer

Почему не назначается новый ключи в итнерфейс?

Вот такой простой пирмер.

var save = make(map[string]interface{})

save["name"] = viper.GetString("db")
save["prefix"] = db.Prefix
save["tables"] = make(map[string]interface{})
save["tables"]["ddd"] = 1


Почему на последенй строке ошибка?

invalid operation: save["tables"]["ddd"] (type interface {} does not support indexing)

Вот так работает

save["name"] = viper.GetString("db")
save["prefix"] = db.Prefix
save["tables"]["ddd"] = 1
fg := make(map[string]interface{})
save["tables"] = fg


А в чем в принципе разница?
  • Вопрос задан
  • 41 просмотр
Пригласить эксперта
Ответы на вопрос 2
Потому что тип interface{} это не map, в него нельзя положить ключ. Из него надо сначала достать map с помощью приведения типов

P.S. Go это не скритовый язык, старайтесь не переносить в него паттерны из Js, PHP, Python. В данной задаче вам скорее всего нужны структуры. map[string]interface{} стоит использовать только в самых крайних случаях.
Ответ написан
@ghostiam
На Go писатель, серверов пинатель.
Как написал Александр Павлюк, вам нужна структура вида:
type Save struct {
	Name string
	Prefix string
	Tables Tables
}

type Tables struct {
	Ddd int
}

func main() {
	s := Save{
		Name:   viper.GetString("db"),
		Prefix: db.Prefix,
		Tables: Tables{
			Ddd: 1,
		},
	}
}


Hе используйте interface{} в го, пока не будете понимать, зачем он вам. Кроме как для Marshal/Unmarshal он в реальном приложении нигде не нужен, особенно для новичков. Тем более, это сильно снижает производительность, по сравнению со структурами и явными типами, что не даёт никакого выигрыша в переходе на го, если писать на нём, как будто он не типизированный.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы