不同类型的Golang接口-传递值时混淆

不同类型的Golang接口-传递值时混淆,go,Go,主程序包 进口( “fmt” “数学” ) //类型 类型方形结构{ 长度浮动64 } 类型圆结构{ 半径浮动64 } 类型-形状界面{ 面积()浮动64 } //方法 func(c圆)面积()浮点64{ 返回math.Pi*c.radius*c.radius } func(s平方)面积()浮点数64{ 返回s.length*s.length } func main(){ c:=圆{ 半径:2.5, } s:=正方形{ 长度:25.5, } 信息(c) 资讯 } 函数信息(s形状){ x:=s.

主程序包
进口(
“fmt”
“数学”
)
//类型
类型方形结构{
长度浮动64
}
类型圆结构{
半径浮动64
}
类型-形状界面{
面积()浮动64
}
//方法
func(c圆)面积()浮点64{
返回math.Pi*c.radius*c.radius
}
func(s平方)面积()浮点数64{
返回s.length*s.length
}
func main(){
c:=圆{
半径:2.5,
}
s:=正方形{
长度:25.5,
}
信息(c)
资讯
}
函数信息(s形状){
x:=s.面积()
格式打印LN(x)
}
这一切都如预期的那样,然而,我不完全理解为什么。我理解在创建与结构的接口方面发生了什么,但是,让我困惑的是,当我传递参数
info(c)
info(s)时,在创建了
circle
square
的类型文字后,我们如何在
func main()
how Go了解我们使用正确参数调用的方法。我觉得可能需要使用某种类型的类型断言:

func信息(s形){
如果s.(类型)=圆{
c、 面积()
}
}
Go知道字体形状将是圆形或方形,然后在背景中Go会为我们选择字体吗?我希望我的问题足够清楚,谢谢

Go知道类型形状将是圆形或方形


不,Go知道这两种类型。这使得可以使用
circle
square
的实例作为
func info(s shape)

的参数。感谢您的回复,如果它不知道是哪种类型,那么它如何知道正确的调用方法?我想这就是我被抓住的地方。@Ctfrancia“如果它不知道是哪种类型”你想得不对。在任何情况下,接口值都不知道其动态类型。接口值通常由两个指针组成,一个指向动态类型的信息,一个指向动态数据。在引擎盖下有一种vtable,用于从接口值中查找正确的方法。但这不是某种类型的开关。该语言在这里做的正是合适的事情。好的,谢谢,我想在它最终“点击”之前,我需要更多的练习。诀窍,如果我们可以称之为“诀窍”,就是任何接口值都包含两个东西:具体类型和该类型的值。将其视为一种秘密结构:
type hidden struct secret{type*T;value*V}
。然后
vari一些接口类型。。。;i=expr
确实是
tmp=expr;i=hidden{type:&u type;value:&tmp}
。如果s.(type)测试正在访问此隐藏秘密结构的
类型
部分,则您的
。写入
s.(圆圈)
逐字断言类型为
circle
,然后访问值部分。请注意,对于机密结构的布局或其中的内容没有任何承诺。我在这里做了两个指针,事实上它们现在是指针,但是有一些愿望是内联“小”值。