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, то всё заведется и заработает, но это же явно неправильно.
Как бы сделать что-то между этими решениями. Отдельный файл но лежащий за пределами стороннего пакета...
  • Вопрос задан
  • 702 просмотра
Решения вопроса 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 поля должны начинаться с заглавной буквы, чтобы они были доступны при импорте.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы