为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中使用相同的接口实现不同的功能

如何在golang中使用相同的接口实现不同的功能

Go
缥缈止盈 2022-12-13 16:23:12
我有这段代码,它返回对切片的引用:package mainimport "fmt"type V2BucketAccess struct {    BucketName   string    AccessPolicy string}func main() {    result := MyFunc()    fmt.Print(*result)}func MyFunc() *[]V2BucketAccess {    parsedBucketsNames := []V2BucketAccess{}    mystuff1 := V2BucketAccess{        BucketName:   "bucket-1",        AccessPolicy: "readwrite",    }    mystuff2 := V2BucketAccess{        BucketName:   "bucket-2",        AccessPolicy: "read",    }    parsedBucketsNames = append(parsedBucketsNames, mystuff1, mystuff2)    return &parsedBucketsNames}我想用命名的返回值重写这个,我想出了这样的事情:package mainimport "fmt"type V2BucketAccess struct {    BucketName   string    AccessPolicy string}func main() {    result := MyFunc()    fmt.Print(*result)}func MyFunc() (parsedBucketsNames *[]V2BucketAccess) {    *parsedBucketsNames = []V2BucketAccess{}    mystuff1 := V2BucketAccess{        BucketName:   "bucket-1",        AccessPolicy: "readwrite",    }    mystuff2 := V2BucketAccess{        BucketName:   "bucket-2",        AccessPolicy: "read",    }    *parsedBucketsNames = append(*parsedBucketsNames, mystuff1, mystuff2)    return}但是,这会在 MyFunc() 函数的第一行生成分段违规。通过命名返回值执行此操作的正确方法是什么,或者这是不应使用命名返回值的情况之一?非常欢迎解释为什么我的解决方案会生成分段错误。
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

需要两个修复:

  • 要在某个变量上调用接口方法,请将变量声明为接口类型。

  • 指针接收器实现了该方法。将指针分配给接口变量。

这是代码:

var s Session        // Declare variable as Session so we can call StarSession

if sessionType == 1 {

    s = &SessionA{}  // note & on this line

} else {

    s = &SessionB{}  // note & on this line

}


查看完整回答
反对 回复 2022-12-13
?
jeck猫

TA贡献1909条经验 获得超7个赞

您可以编写一个接受接口的函数


package main


import "fmt"


type Session interface {

    StartSession()

}

type SessionA struct {

    jobs string

}


type SessionB struct {

    foods string

}


func (sessionA *SessionA) StartSession() {

    fmt.Printf("begin to do %s\n", sessionA.jobs)

}


func (sessionB *SessionB) StartSession() {

    fmt.Printf("begin to eat %s\n", sessionB.foods)

}


func main() {

    sessionType := 1 // maybe 2, just example

    sessionA:= &SessionA{

        jobs: "job1",

    }

    sessionB := &SessionB{

        foods: "food1",

    }



    if sessionType == 1 {

        runSession(sessionA)

    } else {

        runSession(sessionB)

    }

    

    

}


func runSession(s Session) {

    s.StartSession()

}


查看完整回答
反对 回复 2022-12-13
?
白衣非少年

TA贡献1155条经验 获得超0个赞

您可以使用策略模式,通过这种方法,您可以在需要时扩展代码。在运行时实例化的对象取决于某些上下文。


type Session interface { //the common behaviour

    StartSession()

}


type SessionA struct {

    jobs string

}


type SessionB struct {

    foods string

}


func (sessionA *SessionA) StartSession() {

    fmt.Printf("begin to do %s\n", sessionA.jobs)

}


func (sessionB *SessionB) StartSession() {

    fmt.Printf("begin to eat %s\n", sessionB.foods)

}

你的主要可能是:


func main() {

    sessionToExcecute := 1

    sessions := map[int]Session{

        1: &SessionA{jobs: "some job"},

        2: &SessionB{foods: "a food"},

    }

    sessions[sessionToExcecute].StartSession()

}


查看完整回答
反对 回复 2022-12-13
  • 3 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信