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
等,但您也可以自己提供。