mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 05:33:04 +08:00
CH11.3 OK
This commit is contained in:
@@ -0,0 +1,96 @@
|
|||||||
|
# 11.3 <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ӿڱ<D3BF><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
|
||||||
|
|
||||||
|
һ<EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵ı<EFBFBD><EFBFBD><EFBFBD> `varI` <20>п<EFBFBD><D0BF><EFBFBD><D4B0><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ַ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> **<EFBFBD><EFBFBD>̬** <20><><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD>д洢<D0B4><E6B4A2>ֵ<EFBFBD><D6B5>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD><CDA1><EFBFBD>ִ<EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD>ж<EFBFBD>̬<EFBFBD><CCAC><EFBFBD>Ϳ<EFBFBD><CDBF>ܻ<EFBFBD><DCBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڱ<D3BF><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD>ʹ<EFBFBD><CAB9> **<EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD>** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ʱ<EFBFBD><CAB1> `varI` <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `T` <20><>ֵ<EFBFBD><D6B5>
|
||||||
|
|
||||||
|
```go
|
||||||
|
v := varI.(T) // unchecked type assertion
|
||||||
|
```
|
||||||
|
|
||||||
|
**varI<72><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ӿڱ<D3BF><DAB1><EFBFBD>**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᱨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>`invalid type assertion: varI.(T) (non-interface type (type of varI) on left)` <20><>
|
||||||
|
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD>Կ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᾡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʧ<EFBFBD>ܻᵼ<EFBFBD>´<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ķ<EFBFBD>ʽ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD>ԣ<EFBFBD>
|
||||||
|
|
||||||
|
```go
|
||||||
|
if v, ok := varI.(T); ok { // checked type assertion
|
||||||
|
Process(v)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// varI is not of type T
|
||||||
|
```
|
||||||
|
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD>`v` <20><> `varI` ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `T`<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>`ok` <20><><EFBFBD><EFBFBD> `true`<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `v` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `T` <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>`ok` <20><> `false`<EFBFBD><EFBFBD>Ҳû<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
**Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>**<EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `if` <20>в<EFBFBD><D0B2><EFBFBD>һ<EFBFBD><D2BB> `ok` <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʱʹ<CAB1><CAB9><EFBFBD><EFBFBD><EFBFBD>µķ<C2B5><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB7BD><EFBFBD>ģ<EFBFBD>
|
||||||
|
|
||||||
|
```go
|
||||||
|
if _, ok := varI.(T); ok {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
TODO ??<3F><>In this form shadowing the variable varI by giving varI and v the same name is sometimes done.
|
||||||
|
|
||||||
|
ʾ<EFBFBD><EFBFBD> 11.4 type_interfaces.go
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Square struct {
|
||||||
|
side float32
|
||||||
|
}
|
||||||
|
|
||||||
|
type Circle struct {
|
||||||
|
radius float32
|
||||||
|
}
|
||||||
|
|
||||||
|
type Shaper interface {
|
||||||
|
Area() float32
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var areaIntf Shaper
|
||||||
|
sq1 := new(Square)
|
||||||
|
sq1.side = 5
|
||||||
|
|
||||||
|
areaIntf = sq1
|
||||||
|
// Is Square the type of areaIntf?
|
||||||
|
if t, ok := areaIntf.(*Square); ok {
|
||||||
|
fmt.Printf("The type of areaIntf is: %T\n", t)
|
||||||
|
}
|
||||||
|
if u, ok := areaIntf.(*Circle); ok {
|
||||||
|
fmt.Printf("The type of areaIntf is: %T\n", u)
|
||||||
|
} else {
|
||||||
|
fmt.Println("areaIntf does not contain a variable of type Circle")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sq *Square) Area() float32 {
|
||||||
|
return sq.side * sq.side
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ci *Circle) Area() float32 {
|
||||||
|
return ci.radius * ci.radius * math.Pi
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
The type of areaIntf is: *main.Square
|
||||||
|
areaIntf does not contain a variable of type Circle
|
||||||
|
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `Circle`<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> `Shaper` <20>ӿڡ<D3BF> `t, ok := areaIntf.(*Square); ok ` <20><><EFBFBD><EFBFBD> `areaIntf` <20><><EFBFBD>Ƿ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'Square' <20><><EFBFBD>͵ı<CDB5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>ģ<EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> 'Circle' <20><><EFBFBD>͵ı<CDB5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿġ<F1B6A8B5>
|
||||||
|
|
||||||
|
**<EFBFBD><EFBFBD>ע**
|
||||||
|
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `areaIntf.(*Square)` <20>е<EFBFBD> `*` <20>ţ<EFBFBD><C5A3>ᵼ<EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`impossible type assertion: Square does not implement Shaper (Area method has pointer receiver)`
|
||||||
|
|
||||||
|
- [Ŀ¼](directory.md)
|
||||||
|
- <20><>һ<EFBFBD>£<EFBFBD>[11.2 <20>ӿ<EFBFBD>Ƕ<EFBFBD>ӿ<D7BD>](11.2.md)
|
||||||
|
- <20><>һ<EFBFBD>ڣ<EFBFBD>[11.4 <20><><EFBFBD><EFBFBD>switch](11.4.md)
|
@@ -96,6 +96,7 @@
|
|||||||
- 第11章:[接口(interface)与反射(reflection)](11.0.md)
|
- 第11章:[接口(interface)与反射(reflection)](11.0.md)
|
||||||
- 11.1 [接口是什么](11.1.md)
|
- 11.1 [接口是什么](11.1.md)
|
||||||
- 11.2 [接口嵌套接口](11.2.md)
|
- 11.2 [接口嵌套接口](11.2.md)
|
||||||
|
- 11.3 [11.3 如何检测和转换接口变量的类型:类型断言](11.3.md)
|
||||||
|
|
||||||
## 第三部分:Go 高级编程
|
## 第三部分:Go 高级编程
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user