Go:结构体组合扩展时,子结构体执行父结构体方法时会调用谁的方法?

199 阅读1分钟

在Go语言中,结构体组合扩展是实现继承的一种方式。当一个结构体通过组合扩展另一个结构体时,子结构体会继承父结构体的所有字段和方法。

对于方法来说,如果子结构体重写了父结构体的方法,那么子结构体的方法会覆盖父结构体的方法。

例如,假设有如下结构体定义:

Go

type ClusterClient struct {
    GetScanResultUrl func() string
}

type MyClusterClient struct {
    ClusterClient
    GetScanResultUrl func() string
}

MyClusterClient结构体继承了ClusterClient结构体。MyClusterClient结构体重写了GetScanResultUrl()方法,定义了一个新的GetScanResultUrl()方法。

现在,我们创建一个MyClusterClient结构体实例,并调用PutScanRespResult方法:

Go

c := new(MyClusterClient)
err := c.PutScanRespResult(info)

PutScanRespResult方法会调用MyClusterClient结构体的GetScanResultUrl()方法,获取上传扫描结果的URL。由于MyClusterClient结构体重写了GetScanResultUrl()方法,因此PutScanRespResult方法会调用MyClusterClient结构体的GetScanResultUrl()方法,获取URL为"https://my-scan-result-url"的URL。

因此,答案是子结构体的GetScanResultUrl()方法

示例代码:

Go

package main

import (
    "fmt"
    "log"
)

type ClusterClient struct {
    GetScanResultUrl func() string
}

type MyClusterClient struct {
    ClusterClient
    GetScanResultUrl func() string
}

func (c *MyClusterClient) GetScanResultUrl() string {
    return "https://my-scan-result-url"
}

func main() {
    c := new(MyClusterClient)
    err := c.PutScanRespResult(info)
    if err != nil {
        log.Fatal(err)
    }
}

执行上述代码,会输出如下结果:

PutScanRespResult : https://my-scan-result-url

从结果可以看出,PutScanRespResult方法调用了MyClusterClient结构体的GetScanResultUrl()方法,获取URL为"https://my-scan-result-url"的URL。