Задать вопрос
BacCM
@BacCM
C++ почти с рождения

Go можно ли написать функцию расширяющую сторонний пакет?

Есть некий пакет:

ext_api.go
package ext_api

type Data struct {
	a string
	b int
}

func Create() Data {
	d := Data{"text", 10}
	return d
}

func (d *Data) PrintData() {
	println(d.a)
}


И его использование:
package main

import "ext_api"

func main() {
	data := ext_api.Create()
	data.PrintData()
}


Хочется как-то написать свою функцию, например

func (d *Data) PrintDataEx() {
	println(d.a, " ", d.b)
}


Если её попробовать добавить в основной пакет то получим
"cannot define new methods on non-local type ext_api.Data"

Что, наверное, логично.
Но если добавить свой файл в каталог этого пакета с указанием имени пакета package ext_api, то всё заведется и заработает, но это же явно неправильно.
Как бы сделать что-то между этими решениями. Отдельный файл но лежащий за пределами стороннего пакета...
  • Вопрос задан
  • 800 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Go-разработчик с нуля + нейросети
    9 месяцев
    Далее
  • Яндекс Практикум
    Go-разработчик с нуля
    8 месяцев
    Далее
  • Хекслет
    GO-разработчик
    6 месяцев
    Далее
Решения вопроса 1
igorzakhar
@igorzakhar
Вариант 1 - Псевдоним:
type MyType ext_api.Data

func (m *MyType) PrintDataEx() {...}

Вариант 2 - Встраивание:
type MyStruct struct {
    *ext_api.Data
}

func (m *MyStruct) Method() {...}

m := &MyStruct{...}
m.Method()

UPD.
Нужно ещё учитывать что в структуре ext_api.Data поля должны начинаться с заглавной буквы, чтобы они были доступны при импорте.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Воронеж
от 75 000 до 120 000 ₽
ITK academy Нижний Новгород
от 75 000 до 120 000 ₽