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

我有这段代码,它返回对切片的引用:


package main


import "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 main


import "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() 函数的第一行生成分段违规。通过命名返回值执行此操作的正确方法是什么,或者这是不应使用命名返回值的情况之一?非常欢迎解释为什么我的解决方案会生成分段错误。


缥缈止盈
浏览 112回答 3
3回答

侃侃无极

需要两个修复:要在某个变量上调用接口方法,请将变量声明为接口类型。指针接收器实现了该方法。将指针分配给接口变量。这是代码:var s Session        // Declare variable as Session so we can call StarSessionif sessionType == 1 {    s = &SessionA{}  // note & on this line} else {    s = &SessionB{}  // note & on this line}

jeck猫

您可以编写一个接受接口的函数package mainimport "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()}

白衣非少年

您可以使用策略模式,通过这种方法,您可以在需要时扩展代码。在运行时实例化的对象取决于某些上下文。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()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go