Golang中如何使用接口方法?

Golang中如何使用接口方法? 你好,

首先抱歉,我对Go语言还只是个新手。

我目前在服务器类中有以下代码:

package server

import "fmt"

type serverStarter interface {
	StartServer()
}

type Webserver struct{}

func (w Webserver) StartServer() {
	fmt.Printf("Starting server at port 8080\n")
}

func justATest() {
	Webserver.StartServer()
}

这里我遇到了错误:server.go:18:24 not enough arguments in call to Webserver.StartServer

它需要什么参数呢?StartServer方法没有参数,只有一个接收器类型,如果我没看错的话?

我是不是需要先初始化我的Webserver?

比如用 w Webserver,然后在w上调用方法? 但是我该如何初始化一个空的结构体类型呢。

我使用了一个空结构体,因为我通常只是想让这个类型有东西来实现接口,也许有比空结构体类型更好的东西可以使用。

目前,我只是在尝试和摸索。


更多关于Golang中如何使用接口方法?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

Perschistence: 我是否需要先初始化我的Web服务器?

是的,你需要一个“Web服务器”的实例来访问你的方法。

更多关于Golang中如何使用接口方法?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


package main

import (
	"fmt"
)

func New() Webserver{
	return Webserver{}
}

type serverStarter interface {
	StartServer()
}

type Webserver struct{}

func (w Webserver) StartServer() {
	fmt.Printf("Starting server at port 8080\n")
}

func main() {
 	web := New()
	web.StartServer()
}

https://play.golang.org/p/iu-4IHdItir

在Go语言中,接口方法需要通过具体的实例来调用。你的代码中直接使用类型名调用方法,缺少了接收器实例。

以下是修正后的代码示例:

package main

import "fmt"

type serverStarter interface {
    StartServer()
}

type Webserver struct{}

func (w Webserver) StartServer() {
    fmt.Printf("Starting server at port 8080\n")
}

func justATest() {
    // 创建Webserver实例
    w := Webserver{}
    // 通过实例调用方法
    w.StartServer()
    
    // 或者使用指针接收器版本
    w2 := &Webserver{}
    w2.StartServer()
}

func main() {
    justATest()
}

如果你想让结构体真正为空,可以使用以下方式:

type Webserver struct{}

// 或者使用单例模式
var DefaultWebserver = Webserver{}

func justATest() {
    DefaultWebserver.StartServer()
}

接口使用的完整示例:

func startServer(s serverStarter) {
    s.StartServer()
}

func main() {
    ws := Webserver{}
    startServer(ws)  // 传递Webserver实例给接口
    
    // 或者
    var starter serverStarter = Webserver{}
    starter.StartServer()
}

空结构体在Go中是有效的类型,占用0字节内存,常用于只需要类型而不需要存储数据的场景。

回到顶部