【问题标题】:what happend when golang convert struct to interface{} ? what is the cost?当 golang 将 struct 转换为 interface{} 时发生了什么?费用是多少?
【发布时间】:2016-10-14 23:06:57
【问题描述】:

我对 interface{} 类型感到困惑,
如何从 Person 结构构建 interface{} 对象?
如果结构很大,转换成本是否昂贵

type Person struct {  
  name string  
  age  int  
} 

func test(any interface{}) {  

} 

func main() {  
    p := Person{"test", 11}
    // how to build an interface{} object from person struct? 
    // what is the cost? the field need copy?
    test(p) 
}

【问题讨论】:

  • 经验法则:如果您不了解interface{},请不要使用它。
  • 其实我也不想用,但是很多库函数的输入参数是interface{}类型

标签: go struct interface


【解决方案1】:

Interface{} 是一种类型。它由两部分组成:基础类型和基础价值。大小无关紧要。成本是每次转换它或转换它时,都会产生成本。尺寸效应的一件事是从结构复制到接口底层值期间的值。但是这个成本类似于你分配给一个结构或复制到一个结构时得到的成本。接口的额外成本不受尺寸影响。

你不需要那个函数来转换,你可以这样转换:

func main() {
    p := Person{"test", 11}
    // how to build an interface{} object from person struct?
    // what is the cost? the field need copy?
    var v interface{}
    v = p    
}

【讨论】:

  • 转换时,它只是分配底层指针?还是需要创建一个新的 tmp 对象,然后复制值?
  • 不。上述示例中的值副本。
  • 类似地,当您将其转换为 k := v.(Person) 之类的值时,它会使用一个新值。但这不是唯一的成本,类型检查是额外的成本。
  • span class="comcopy">sorry,v = p,如果按三步赋值,首先在堆上分配一个新对象,第二个将p值复制到新对象,第三个将v指针赋值给新对象,赋值如果 p 对象大小很大,成本非常昂贵
  • 是的。但是,即使您分配给另一个 struct var,该成本也会保留。或复制到另一个值。从结构到接口的不同之处在于类型检查成本和基础类型成本。将通过此说明修改我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2021-05-03
  • 2017-10-17
  • 2014-12-30
  • 1970-01-01
  • 2014-02-15
  • 2010-10-07
相关资源
最近更新 更多