func Fu(instance interface{}) interface{}
{
//Неким образом извлекаем значение обёрнутое в интерфейс или получаем его тип
//Создаём экземпляр (если это был тип)
//Работа с объектом
return result
}
--
Рефлексия в жизни нужна в очень редких случаях типа парсеров, сериализаторов, драйверов баз данных и прочих штук, которые заранее не знают, с каким типами им работать.
func MaterializeFromFile(instance interface{}, path string) ( interface{}, error) {
file, err := os.Open(path)
if err != nil {
return nil , err
} else {
restore := // А вот здесь нужно понять, какого типа переменная, тип берётся из instance, т.к. ниже decoder.Decode() принимает значение определённого типа
// вероятно, можно передавать и просто сразу тип, но казалось, что с готовым объектом(хз. как ещё назвать всё в Go одним термином) будет реализовать проще...(но не тут-то было)
decoder := gob.NewDecoder(file)
decoder.Decode(&restore)
return restore, nil }
}
tp := reflect.TypeOf(instance)newInstanceValue := reflect.New(tp)newInstance := newInstanceValue.Interface()Не очень понятно, что именно вы понимаете под "Работа с объектом". Переменная newInterface имеет тип interface{}, и с ним или generic-операции можно делать, или к конкретному типу преобразовывать.А что за задачу вы решаете? Рефлексия в жизни нужна в очень редких случаях типа парсеров, сериализаторов, драйверов баз данных и прочих штук, которые заранее не знают, с каким типами им работать.
On Tue, Jun 18, 2019 at 7:24 PM Александр Рем <gen...@live.ru> wrote:
Мучаюсь с этим вопросом и как-то всё не то...--Имеем:
func Fu(instance interface{}){
interface{}
//Неким образом извлекаем значение обёрнутое в интерфейс или получаем его тип
//Создаём экземпляр (если это был тип)
//Работа с объектом
return result
}
но, не пойму
reflect.TypeOf() - не годится для new()
аreflect.ValueOf() - это type reflect.Value, что не годится для работы
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес gola...@googlegroups.com.
tp := reflect.TypeOf(instance)
--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/fc6265a2-769f-48de-95ca-5663e796f0e3%40googlegroups.com.
func MaterializeFromFile(instance interface{}, path string) ( interface{}, error) {
file, err := os.Open(path)
if err != nil {
return nil , err
} else {
restore := /* А вот здесь нужно понять, какого типа переменная, тип берётся из instance, т.к. ниже decoder.Decode() принимает значение определённого типа.
Вероятно, можно передавать и просто сразу тип, но казалось, что с
готовым объектом(хз. как ещё назвать всё в Go одним термином) будет
реализовать проще...(но не тут-то было) */
decoder := gob.NewDecoder(file)
decoder.Decode(&restore)
return restore, nil }
}
MaterializeFromFile()
) к нужному типу при помощи switch1. Покажите код - вы что-то не так делаете, скорее всего. Вы уверены, что передаёте указатель на созданный объект, а не указатель на interface {}?2. В вашем случае рефлексия-таки не нужна. Поменяйте API вашей функции на такое, где пользователь сам передает указатель на структуру, которую надо десериализовать (пусть даже и interface{}), и вы этот указатель просто один в один передаёте дальше в Decode.
On Wed, Jun 19, 2019, 06:15 Александр Рем <gen...@live.ru> wrote:
Ммм... Печаль...--
Так не работает. Тип-то newInstance действительно по прежнему interface {}Err: gob: local interface type *interface {} can only be decoded from remote interface type; received concrete type ExmplStrct = struct { ID string; X string; Y int; Z int; }Как-то не верится, что нельзя создать объект опосредовано, через рефлексию...
Но может тогда можно в функцию передовать непосредственно значение типа? (в виде некого самостоятельного значения или в виде строки)вторник, 18 июня 2019 г., 22:27:49 UTC+3 пользователь Alex Lurye написал:tp := reflect.TypeOf(instance)newInstanceValue := reflect.New(tp)newInstance := newInstanceValue.Interface()
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес gola...@googlegroups.com.
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/ce8101ca-8c9c-4e1f-a3ae-b399556be3c1%40googlegroups.com.
MaterializeFromFile??
Не очень понял вопрос. Что значит как вызываешь?
Сейчас функция имеет вид
func MaterializeFromFile(instance interface{}, path string) ( interface{}, error) {...}
Соответственно так и вызываю.
Любой компонент который хочет десериализовать нечто из gob-файла и знает тип и путь, может воспользоваться этой функцией и получить искомое в пустом интерфейсе, после чего привести к нужному типу (ибо тип он знает)
upd
instance может быть как экземпляром нужного типа, так и собственно типом (типа тип или стринг (просто как так реализовать я совсем не понял))
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/ce8101ca-8c9c-4e1f-a3ae-b399556be3c1%40googlegroups.com.
Вы самую важную часть и не привели. "..." в строке "restore := ..." скорее всего и содержит баг.
func MaterializeFromFile(instance interface{}, path string) ( interface{}, error) {
file, err := os.Open(path)
if err != nil {
return nil , err
} else {
tp := reflect.TypeOf(instance)
newInstanceValue := reflect.New(tp)
newInstance := newInstanceValue.Interface()
decoder := gob.NewDecoder(file)
decоdeErr := decoder.Decode(&newInstance)
if decоdeErr != nil {
fmt.Println( "Ошибко", decоdeErr)
}
return newInstance, nil }
}
--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/837fad7f-fd56-4fa4-9087-a2c929842cb8%40googlegroups.com.
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес gola...@googlegroups.com.
Я правда не совсем понял, что там за магия и почему в случае ссылки интерфейс как бы "прозрачен", а в случаее самого значения нет, но это уже выходит за рамки обсуждения, авось усвоится со временем.
так а не надо такую ситуацию создавать.
go - язык статической типизации, не надо в него тянуть динамику
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/golang-ru/CAKaHDOEPu3vtO7D3CRm__HefDXPe-f9%2BSkJ8S5%2B3GhxgbaB9QQ%40mail.gmail.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.