接口对象转型
方式一:
instance,ok:=接口对象.(实际类型)
如果该接口对象是对应的实际类型,那么instance就是转型之后对象,ok的值为true
配合if...else if...使用
方式二:
接口对象.(type)
配合switch...case语句使用
<pre class="has"><code class="language-Go">type shape interface {
perimeter() float64
area() float64
}
type rectangle struct {
a, b float64
}
type triangle struct {
a, b, c float64
}
type circular struct {
radius float64
}
func (r rectangle) perimeter() float64 {
return (r.a r.b) * 2
}
func (r rectangle) area() float64 {
return r.a * r.b
}
func (t triangle) perimeter() float64 {
return t.a t.b t.c
}
func (t triangle) area() float64 {
p := t.perimeter() / 2
return math.Sqrt(p * (p - t.a) * (p - t.b) * (p - t.c))
}
func (c circular) perimeter() float64 {
return c.radius * math.Pi * 2
}
func (c circular) area() float64 {
return math.Pow(c.radius, 2) * math.Pi
}
func getType(s shape) {
if i,ok := s.(rectangle); ok{
fmt.Printf("图形的长:%.2f,图形的宽:%.2f \n", i.a, i.b)
} else if i,ok := s.(triangle); ok {
fmt.Printf("图形的第一个边:%.2f,图形的第二个边:%.2f,图形的第三个边:%.2f \n", i.a, i.b, i.c)
} else if i,ok := s.(circular); ok {
fmt.Printf("图形的半径:%.2f \n",i.radius)
}
}
func getResult(s shape) {
fmt.Printf("周长为:%.2f,面积为:%.2f \n",s.perimeter(),s.area())
fmt.Println("------------------------------")
}
func transInterface1() {
var s shape
s = rectangle{10, 20}
getType(s)
getResult(s)
s = triangle{30, 40, 50}
getType(s)
getResult(s)
s = circular{50}
getType(s)
getResult(s)
}</code></pre>
上面的例子使用的是方式一,如果要使用方式2,可以将getType()函数改为:
<pre class="has"><code class="language-Go">func getType(s shape) {
switch i := s.(type) {
case rectangle:
fmt.Printf("图形的长:%.2f,图形的宽:%.2f \n", i.a, i.b)
case triangle:
fmt.Printf("图形的第一个边:%.2f,图形的第二个边:%.2f,图形的第三个边:%.2f \n",i.a,i.b,i.c)
case circular:
fmt.Printf("图形的半径:%.2f \n",i.radius)
}
}</code></pre>
PS:上面求三角形面积使用了海伦公式求三角形的面积,公式为:
三角形的面积=平方根[三角形周长的一半×(三角形周长的一半减去第一个边)×(三角形周长的一半减去第二个边)×(三角形周长的一半减去第三个边)]
<blockquote class="layui-elem-quote" style="width: 100%;overflow:hidden">
作者: ynzcxx
链接: https://blog.csdn.net/ynzcxx/article/details/100052657
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
</blockquote>
到此这篇关于“GoLang学习笔记(三十六)接口对象的转型”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
GoLang学习笔记(三十六)接口对象的转型
想系统学习GO语言(Golang
go语言学习笔记(十三)——接口类型
GoLang学习笔记(三十四)接口及空接口
php入门实例查询数据库记录
Golang学习笔记(十二):接口的声明与使用
go语言学习笔记(第3章)—面向对象编程
go struct 成员变量后面再加个字符串是什么意思?_Go语言的学习笔记(第十章) 接口...
golang基础教程
asp.net中2, 8, 10, 16进制转换