有人可以解释为什么这不起作用,我们如何从示例中显示的函数返回接口片段[] 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
);
类型,我只是在这里使用字符串作为示例。
谢谢!
答案 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]
答案 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)