从函数返回空接口的切片

时间:2018-06-11 16:19:12

标签: go

有人可以解释为什么这不起作用,我们如何从示例中显示的函数返回接口片段[] interface {}?

func

可以在此处找到运行代码的示例: https://play.golang.org/p/vcEGHSdWrjv

顺便说一句,这是[]string我尝试从https://godoc.org/github.com/mongodb/mongo-go-driver/mongo#Collection.Distinct提取数据

注意:我们期望的类型并不总是function tf_do_product_desc() { global $woocommerce, $post; if ( $post->post_content ) : ?> <div itemprop="description"> <?php $heading = apply_filters('woocommerce_product_description_heading', __('Product Description', 'woocommerce')); ?> <!-- <h2><?php echo $heading; ?></h2> --> <div><a class="btn-buy" href="http://wingwahwatch.com/contact/" target="_blank">BUY NOW</a></div> <h4 class="meta-title" style="margin: 60px 0 30px 0;"><span>Product Details</span></h4> <div itemprop="description" class="short-description"> <?php the_content(); ?> </div> <!-- SHOP WITH US ICON --> <h4 class="meta-title meta-title__absolute" style="margin: 30px 0;"><span>SHOP WITH CONFIDENCE</span></h4> <div class="row mb30"> <div class="col-md-2 text-center product-icon-box"><a href="http://wingwahwatch.com/certified/" target="_blank"><img class="center-block" src="http://wingwahwatch.com/wp-content/uploads/2015/11/icon-ori.png" /> <i>Authenticity & Restoration</i></a></div> <div class="col-md-2 text-center product-icon-box"><a href="http://wingwahwatch.com/warranty/" target="_blank"><img class="center-block" src="http://wingwahwatch.com/wp-content/uploads/2015/11/icon-waranty.png" /> <i>12 Months Warranty</i></a></div> <div class="col-md-2 text-center product-icon-box"><a href="http://wingwahwatch.com/buy-back/" target="_blank"><img class="center-block" src="http://wingwahwatch.com/wp-content/uploads/2015/11/icon-buyback.png" /> <i>Buy Back / Trade In Guarantee</i></a></div> <div class="col-md-2 text-center product-icon-box"><a href="http://wingwahwatch.com/shipping/" target="_blank"><img class="center-block" src="http://wingwahwatch.com/wp-content/uploads/2015/11/icon-shipping.png" /> <i>Shipping & Returns</i></a></div> </div> </div> <?php endif; } add_action( 'woocommerce_single_product_summary', 'tf_do_product_desc', 55 ); 类型,我只是在这里使用字符串作为示例。

谢谢!

2 个答案:

答案 0 :(得分:2)

在你的例子中,你并没有试图&#34;返回&#34;切片,但你似乎想要修改参数以指向一个新的字符串片段。

你这样做的方式不起作用,因为在Go中,参数是按值传递的。

执行此操作时:

t = a

t是您作为参数发送给该函数的&test副本

因此修改t不会改变您的test变量。

您需要传入指针的地址,以便能够修改指针所指向的内容。

尝试这种方式:

func main() {
    var test *[]string
    Test(&test)
    fmt.Println(*test)
}

func Test(t interface{}) {
    a := []string{"first", "second"}
    fmt.Println(a)
    *t.(**[]string) = &a
}

输出:

[first second]
[first second]

游乐场:https://play.golang.org/p/tliMrmliykp

答案 1 :(得分:1)

因为[]字符串和[]接口{}是不同的类型,所以不能将一个指定给另一个。

您必须复制切片以将[] interface {}转换为某个特定类型的切片。如果您知道[] interface {}始终包含字符串值,请使用以下命令:

func stringSlice() []string {
    a := []interface{}{"first", "second"} // query result
    fmt.Println(a)

    result := make([]string, len(a))
    for i := range a {
       var ok bool
       result[i], ok = a[i].(string)
       if !ok {
          // handle error with unexpected type
       }
    }
    return result
}

如果结果可以包含任意元素类型,则使用reflection复制切片:

func anySlice(result interface{}) {
    a := []interface{}{"first", "second"} // query result

    slice := reflect.ValueOf(result).Elem()
    elementType := slice.Type().Elem()
    for _, v := range a {
        rv := reflect.ValueOf(v)
        if !rv.Type().AssignableTo(elementType) {
            // handle error with unexpected type
        }
        slice.Set(reflect.Append(slice, rv))
    }
}

像这样使用:

var s []string
anySlice(&s)

playground example