第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何實(shí)現(xiàn)具有相同方法名稱和不同參數(shù)的兩個(gè)接口

如何實(shí)現(xiàn)具有相同方法名稱和不同參數(shù)的兩個(gè)接口

Go
料青山看我應(yīng)如是 2022-12-05 17:20:43
我有兩個(gè)不同的接口(來(lái)自兩個(gè)不同的包)我想實(shí)現(xiàn)。但是他們有沖突,就像這樣:type InterfaceA interface {  Init()}type InterfaceB interface {  Init(name string)}type Implementer struct {} // Wants to implement A and Bfunc (i Implementer) Init() {}func (i Implementer) Init(name string) {} // Compiler complains它說(shuō)“方法重新聲明”。一個(gè)結(jié)構(gòu)如何實(shí)現(xiàn)兩個(gè)接口?
查看完整描述

3 回答

?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

正如已經(jīng)回答的那樣,這是不可能的,因?yàn)?Golang 不(并且可能不會(huì))支持方法重載。

查看Golang 常見(jiàn)問(wèn)題解答

使用其他語(yǔ)言的經(jīng)驗(yàn)告訴我們,具有相同名稱但不同簽名的各種方法偶爾有用,但在實(shí)踐中也可能令人困惑和脆弱。僅按名稱匹配并要求類型一致是 Go 類型系統(tǒng)中的一個(gè)主要簡(jiǎn)化決策。


查看完整回答
反對(duì) 回復(fù) 2022-12-05
?
哆啦的時(shí)光機(jī)

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊

這不可能。

在 go 中,你必須有一個(gè)單一的方法簽名。

您應(yīng)該重命名一種方法。



查看完整回答
反對(duì) 回復(fù) 2022-12-05
?
長(zhǎng)風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊

方法簽名必須匹配。如果你想要依賴注入,我會(huì)推薦功能選項(xiàng)模式。功能選項(xiàng)是返回在構(gòu)造函數(shù)的循環(huán)中調(diào)用的其他函數(shù)的函數(shù)。這是一個(gè)如何使用功能選項(xiàng)和接口基礎(chǔ)知識(shí)的示例。


package main


import (

    "fmt"

    "strconv"

)

type SomeData struct {

    data string

}

// SomeData and SomeOtherData both implement SomeInterface and SomeOtherInterface

// SomeInterface and SomeOtherInterface both implement each other.

type SomeInterface interface {

    String() string

    Set(data string)


}


func (s *SomeData)String() string {

    return s.data

}


func (s *SomeData)Set(data string)  {

    s.data = data

}


// SetDataOption is a functional option that can be used to inject a constructor dep

func SetDataOption(data string) func(*SomeData) {

   return func(s *SomeData) {

       s.Set(data)

   }

}

// NewSomeData is the constructor; it takes in 0 to many functional options and calls each one in a loop.

func NewSomeData(options ...func(s *SomeData)) SomeInterface {

   s := new(SomeData)


   for _, o := range options {

       o(s)

   }

   return s

}


//********************

type SomeOtherData struct {

    data string

    i    int

}


type SomeOtherInterface interface {

    String() string

    Set(data string)


}



func (s *SomeOtherData)String() string {

    return s.data + "  " + strconv.Itoa(s.i)

}


func (s *SomeOtherData)Set(data string)  {

    s.data = data

}



func SetOtherDataOption(data string) func(*SomeOtherData) {

   return func(s *SomeOtherData) {

      s.Set(data)

   }

}


func SetOtherIntOption(i int) func(*SomeOtherData) {

    return func(s *SomeOtherData) {

        s.i = i

    }

 }



// NewSomeOther data works just like NewSomeData only in this case, there are more options to choose from

// you can use none or any of them.

func NewSomeOtherData(options ...func(s *SomeOtherData)) SomeOtherInterface {

   s := new(SomeOtherData)


   for _, o := range options {

       o(s)

   }

   return s

}


//*********************************

// HandleData accepts an interface

// Regardless of which underlying struct is in the interface, this function will handle 

// either by calling the methods on the underlying struct.

func HandleData(si SomeInterface) {

    fmt.Println(si)  // fmt.Println calls the String() method of your struct if it has one using the Stringer interface

}


func main() {

    someData := NewSomeData(SetDataOption("Optional constructor dep"))

    someOtherData := NewSomeOtherData(SetOtherDataOption("Other optional constructor dep"), SetOtherIntOption(42))

    HandleData(someData) // calls SomeData.String()

    HandleData(someOtherData) // calls SomeOtherData.String()

    someOtherData = someData // assign the first interface to the second, this works because they both implement each other.

    HandleData(someOtherData) // calls SomeData.String()  because there is a SomeData in the someOtherData variable.

    

}


查看完整回答
反對(duì) 回復(fù) 2022-12-05
  • 3 回答
  • 0 關(guān)注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)