Go 覆盖匿名结构函数
如何覆盖匿名结构函数 要澄清我的意思,请查看以下代码片段:Go 覆盖匿名结构函数,go,Go,如何覆盖匿名结构函数 要澄清我的意思,请查看以下代码片段: package base import ( "fmt" "net/http" ) type Executer interface { Execute() } type Controller struct { } func (self *Controller) Execute() { fmt.Println("Hello Controller") } func (self *Controller)
package base
import (
"fmt"
"net/http"
)
type Executer interface {
Execute()
}
type Controller struct { }
func (self *Controller) Execute() {
fmt.Println("Hello Controller")
}
func (self *Controller) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
self.Execute()
}
现在我将控制器结构嵌入到测试结构中,也称为匿名
package base
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
)
type Test struct {
Controller
}
func (self *Test) Execute() {
fmt.Println("Hello Test")
}
func TestInheritance(t *testing.T) {
ts := httptest.NewServer(&Test{})
defer ts.Close()
http.Get(ts.URL)
}
作为输出,我得到了“Hello Controller”,但期望得到“Hello Test”。您可以看到上面的代码,我重新实现了execute函数,但它不起作用 因为
Test
没有ServeHTTP
方法,所以测试服务器使用Controller
,它调用Controller.Execute()
。如果希望它正常工作,请为Test
类型定义servehtp
type Test struct {
Controller
}
Controller
没有ServeHTTP
方法,但*Controller
有。所以
type Test struct {
*Controller
}
我认为它会起作用。Golang不支持抽象方法?所以我每次都要重新实现ServeHTTP?测试有ServeHTTP方法,它是从ControllerNo继承的,go没有抽象方法。也没有继承,只有委托。您正在调用
Controller.ServeHTTP
@zero\u coding如果您想有效地使用Go,您需要停止使用C++/javaoop术语。围棋是一种作文语言。您的测试
没有servehtp
,因此它将其委托给自己的控制器
。如果你不想让它委派这个任务,那么定义测试自己的方法。因此,go语言在多态性部分(如java)是没有效率的?@zero\u编码:你仍然在问go是否有抽象方法或java的多态性,这表明你没有花时间真正学习go。将Java翻译成Go不会很好。如果您试图删除或交换Executer
功能,那么您是在倒退。将执行器
嵌入(或以其他方式包括)到控制器
(可能让它使用defaultExecute
类型或类似类型,除非另有说明),然后给它一个stubExecute
/testExecute
/测试执行器
的任何实现。GO不是java,GO不是C++。这类事情的一个例子是net/http
包如何使用DefaultClient
、DefaultServeMux
、DefaultTransport
等,但您也可以自己提供。