Bir arabirimin parçası olmak için yeniden düzenleme yöntemi

0

Soru

Bazen Go'nun açık doğasıyla mücadele eden eski bir python geliştiricisiyim. Bir yöntemi bir yapıdan bir arayüzün parçası olmak için taşıyabilmek için bazı kodları yeniden düzenlemeye çalışıyorum. Ama süreç bana garip geliyor, yanlış bir şey yapmadığımı doğrulamak istiyorum.

Aşağıdaki arayüzlere, yapıya ve yöntemlere sahibim:

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"}
}

Yani burada genel bir arabirim Yürütmem var, bu arabirime GetExecuter yöntemi tarafından döndürülen nesne tarafından erişilecektir.

Şimdi, Yürütücülerimden birinin uygulanmasının bir parçası olarak, Biçim yöntemini bir arabirimin parçası olarak taşımak istiyorum.
Bu yüzden aşağıdakileri yapıyorum:

type Formatting interface {
    format() string
}

type Formatter struct {}

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

Bu yüzden yeni bir arayüz, yeni bir boş yapı oluşturuyorum ve önceki yapımı öznitelik olarak almak için işlevimi güncelliyorum.

Bu iş gibi görünüyor olsa da, benim için bu biraz kıvrık gibi görünüyor. Özellikle, ilk nesneme yöntemin özniteliği olarak bir başvuru eklemem gereken kısım. Burada yanlış bir şey mi yapıyorum yoksa doğru yol bu mu?

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

En iyi cevabı

3

Senin Executer uygulama zaten uygular Formatting arayüz:

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

Burada dikkat edilmesi gereken bir şey var: Kodunuz işaretçi alıcılarını gösterir. Yöntem tanımlanmış demektir *MyExecuter ama değil MyExecuter. Bu nedenle, bunun çalışması için işaretçileri struct örneğine iletmeniz gerekir. Ya da yukarıda yaptığım gibi, değer alıcılarını kullanın, böylece yöntemler her ikisi için de tanımlanır MyExecuter ve *MyExecuter.

2021-11-22 20:47:20

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................