函数使用接口时将指针传递给字符串?

时间:2018-08-24 22:34:07

标签: go

我正在将指向字符串的指针传递给带有接口的方法(我具有该方法的多个版本,并且具有不同的接收者,因此我尝试使用空接口,以免最终失败从本质上讲,我想用切片中的第一个值填充字符串。我能够看到该值填充在函数中,但是由于某种原因,在我的应用程序中,它称为tha值不会改变。我怀疑这是某种指针算术问题,但确实可以使用一些帮助!

我有以下界面:

type HeadInterface interface{
    Head(interface{})
}

然后我有以下功能:

func Head(slice HeadInterface, result interface{}){
    slice.Head(result)
}

func (slice StringSlice) Head(result interface{}){
    result = reflect.ValueOf(slice[0])
    fmt.Println(result)
}

然后...这是我从调用mehtod的应用程序中对函数的调用...

func main(){
    test := x.StringSlice{"Phil", "Jessica", "Andrea"}

    // empty result string for population within the function
    var result string = ""

    // Calling the function (it is a call to 'x.Head' because I lazily just called th import 'x')
    x.Head(test, &result)

    // I would have thought I would have gotten "Phil" here, but instead, it is still empty, despite the Println in the function, calling it "phil.
    fmt.Println(result)
}

*注意:我知道获取第一个元素并不需要那么复杂,可以将slice [0]作为直接的断言,但这更多的是在可重用代码中以及在尝试时进行的练习。为了掌握指针,所以请不要指出该解决方案-在这里我会从解决我的实际问题的解决方案中获得更多使用* :)

1 个答案:

答案 0 :(得分:0)

正如您在NOTE中所说,我很确定这不必太复杂,而是要使其在您的上下文中起作用:

package main

import (
    "fmt"
    "reflect"
)

type HeadInterface interface {
    Head(interface{})
}

func Head(slice HeadInterface, result interface{}) {
    slice.Head(result)
}

type StringSlice []string

func (slice StringSlice) Head(result interface{}) {
    switch result := result.(type) {
    case *string:
        *result = reflect.ValueOf(slice[0]).String()
        fmt.Println("inside Head:", *result)
    default:
        panic("can't handle this type!")
    }

}

func main() {
    test := StringSlice{"Phil", "Jessica", "Andrea"}

    // empty result string for population within the function
    var result string = ""

    // Calling the function (it is a call to 'x.Head' because I lazily just called th import 'x')
    Head(test, &result)

    // I would have thought I would have gotten "Phil" here, but instead, it is still empty, despite the Println in the function, calling it "phil.
    fmt.Println("outside:", result)
}

使用interface {}的困难之处在于,鉴于interface {}是最不确定的类型,很难具体说明类型的行为。若要修改作为函数指针传递的变量,必须在变量上使用星号(取消引用)(例如* result),以便更改其指向的值,而不是指针本身。但是要使用星号,您必须知道它实际上是一个指针(interface {}并没有告诉您),所以这就是为什么我使用类型开关确保它是指向字符串的指针的原因。