@alexdora
Топ-менеджер

Как сделать видимость в 2-х разных пакетах структуры из 3-го?

Я даже не знаю как вопрос правильно сформулировать, но кодом. Есть 3 пакета: p1,p2,p3

В p3 находится структура к примеру test, которую вызывают пакеты p1,p2
И первые 2 пакета импортируются в main.

import {
"p1"
"p2"
}

result1 = p1.somefunc(val)
result2 = p2.anotherfunc(<b>result1</b>)


Грубо говоря из первого пакета вызывается функция, которая что-то делает и её результат передается функции из второго пакета. Результатом является структура из 3 пакета.

В самих p1,p2 структура подтягивается import

P1
import "p3"

type SM p3.SM

func somefunc(val) (SM) { ... }


P2
import "p3"

type SM p3.SM

func anotherfunc(SM) (somereturn) { ... }


Проблема в том что при вызове таком он мне сразу ругается:

cannot use result1 (p1.SM) as type p2.SM in argument to p2.anotherfunc

Я понимаю в чем ошибка, я в пакете p1,p2 создал разные экземпляры p3.SM структуры. Я пытаюсь понять как это обойти без всяких копирований reflect и прочего. Мне кажется есть решение супер простое, может быть какие-то интерфейсы которые я вообще не понимаю или где-то какой-то ссылкой пойти. Не хочется в двух пакетах убирать объявление type SM p3.SM и во всех функциях делать прямую ссылку на P3 пакет. Я проверил так работает, но гибкость пропадает.
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
DollyPapper
@DollyPapper
А зачем вы вообще сделали алиас на тип p3.SM? Возвращайте просто p3.SM из p1 somefunc и принимайте p3.SM в p2 anotherfunc. Ну либо если вам зачем то прям понадобился этот алиас, то приведите тип anotherfunc(p3.SM(SM)).
UPD: в Go нет динамической диспетчеризации. То что вы пытаетесь сделать - создать подтип с помощью алиаса. В Go это не прокатит.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@falconandy
А так в P1 и P2?
type SM = p3.SM
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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