Метод рефакторинга, чтобы быть частью интерфейса

0

Вопрос

Я бывший разработчик python, иногда борющийся с явной природой Go. Я пытаюсь здесь реорганизовать некоторый код, чтобы иметь возможность перемещать метод из одной структуры в часть интерфейса. Но этот процесс кажется мне странным, я хочу подтвердить, что не делаю что-то неправильно.

У меня есть следующие интерфейсы, структура и методы:

type Executing interface {
    Execute()
}

type MyExecuter struct {
     attribut1 string
}

//The function I wish to move
func (exe1 *MyExecuter) format() string {
    return fmt.sprintf ("formated : %s", exe1.attribut1) 
}


func (exe1 *MyExecuter) Execute() {
    //Executing
    fmt.Println(exe.format())
}



func GetExecuter () Executer{
    return MyExecuter{attribut1: "test"}
}

Итак, здесь у меня есть общий интерфейс выполнения, доступ к этому интерфейсу будет осуществляться объектом, возвращаемым методом GetExecuter.

Теперь, в рамках реализации одного из моих исполнителей, я хочу переместить метод форматирования как часть интерфейса.
Поэтому я делаю следующее:

type Formatting interface {
    format() string
}

type Formatter struct {}

func (formatter *Formatter) format(exe1 *MyExecuter) (string) {
    return fmt.sprintf ("formated : %s", exe1.attribut1)
}

Поэтому я создаю новый интерфейс, новую пустую структуру и обновляю свою функцию, чтобы использовать в качестве атрибута мою предыдущую структуру.

Хотя это, кажется, работает, мне кажется, что это немного запутанно. Особенно та часть, где мне нужно добавить ссылку на мой исходный объект в качестве атрибута метода. Я делаю здесь что-то не так, или это правильный путь?

go interface
2021-11-22 20:42:22
1

Лучший ответ

3

Ваш Executer реализация уже реализует Formatting интерфейс:

type Executing interface {
    Execute()
}

type Formatting interface {
    format() string
}

func (exe1 MyExecuter) format() string {
    return fmt.sprintf ("formated : %s", exe1.attribut1) 
}


func (exe1 MyExecuter) Execute() {
    //Executing
    fmt.Println(exe.format())
}

v:=MyExecuter{}
// Here, v implements Executing and Formatting interfaces

Здесь следует отметить одну вещь: ваш код показывает приемники указателей. Это означает, что методы определены для *MyExecuter, но не для MyExecuter. Поэтому вам нужно передать указатели на экземпляр структуры, чтобы это сработало. Или, как я сделал выше, используйте приемники значений, чтобы методы были определены для обоих MyExecuter и *MyExecuter.

2021-11-22 20:47:20

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................