mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 00:05:14 +08:00
CH 11.9 OK
This commit is contained in:
253
eBook/11.9.md
253
eBook/11.9.md
@@ -0,0 +1,253 @@
|
||||
# 11.9 <20>սӿ<D5BD>
|
||||
|
||||
## 11.9.1 <20><><EFBFBD><EFBFBD>
|
||||
|
||||
**<EFBFBD>սӿڻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>ӿ<EFBFBD>**<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κη<CEBA><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD>κ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
||||
|
||||
```go
|
||||
type Any interface {}
|
||||
```
|
||||
|
||||
<EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD>˿սӿڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `Java/C#` <20><> `Object` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>`any` <20><> `Any` <20>ǿսӿ<D5BD>һ<EFBFBD><D2BB><EFBFBD>ܺõı<C3B5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
|
||||
|
||||
<EFBFBD>սӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `Java/C#` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>ࣺ `Object` <20>࣬<EFBFBD><E0A3AC><EFBFBD>ߵ<EFBFBD>Ŀ<EFBFBD><C4BF>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>սӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵ı<EFBFBD><EFBFBD><EFBFBD> `var val interface {}` <20><><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><D6B5>
|
||||
|
||||
ʾ<EFBFBD><EFBFBD> 11.8 empty_interface.go<67><6F>
|
||||
|
||||
```go
|
||||
package main
|
||||
import "fmt"
|
||||
|
||||
var i = 5
|
||||
var str = "ABC"
|
||||
|
||||
type Person struct {
|
||||
name string
|
||||
age int
|
||||
}
|
||||
|
||||
type Any interface{}
|
||||
|
||||
func main() {
|
||||
var val Any
|
||||
val = 5
|
||||
fmt.Printf("val has the value: %v\n", val)
|
||||
val = str
|
||||
fmt.Printf("val has the value: %v\n", val)
|
||||
pers1 := new(Person)
|
||||
pers1.name = "Rob Pike"
|
||||
pers1.age = 55
|
||||
val = pers1
|
||||
fmt.Printf("val has the value: %v\n", val)
|
||||
switch t := val.(type) {
|
||||
case int:
|
||||
fmt.Printf("Type int %T\n", t)
|
||||
case string:
|
||||
fmt.Printf("Type string %T\n", t)
|
||||
case bool:
|
||||
fmt.Printf("Type boolean %T\n", t)
|
||||
case *Person:
|
||||
fmt.Printf("Type pointer to Person %T\n", t)
|
||||
default:
|
||||
fmt.Printf("Unexpected type %T", t)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
val has the value: 5
|
||||
val has the value: ABC
|
||||
val has the value: &{Rob Pike 55}
|
||||
Type pointer to Person *main.Person
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>ӿڱ<EFBFBD><EFBFBD><EFBFBD> `val` <20><><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD><CEB8><EFBFBD>һ<EFBFBD><D2BB> `int`<EFBFBD><EFBFBD>`string` <20><> `Person` ʵ<><CAB5><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ȼ<EFBFBD><C8BB>ʹ<EFBFBD><CAB9> `type-swtich` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD>ÿ<EFBFBD><C3BF> `interface {}` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD>롣
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> emptyint_switch.go ˵<><CBB5><EFBFBD>˿սӿ<D5BD><D3BF><EFBFBD> `type-swtich` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `lambda` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD>
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type specialString string
|
||||
|
||||
var whatIsThis specialString = "hello"
|
||||
|
||||
func TypeSwitch() {
|
||||
testFunc := func(any interface{}) {
|
||||
switch v := any.(type) {
|
||||
case bool:
|
||||
fmt.Printf("any %v is a bool type", v)
|
||||
case int:
|
||||
fmt.Printf("any %v is an int type", v)
|
||||
case float32:
|
||||
fmt.Printf("any %v is a float32 type", v)
|
||||
case string:
|
||||
fmt.Printf("any %v is a string type", v)
|
||||
case specialString:
|
||||
fmt.Printf("any %v is a special String!", v)
|
||||
default:
|
||||
fmt.Println("unknown type!")
|
||||
}
|
||||
}
|
||||
testFunc(whatIsThis)
|
||||
}
|
||||
|
||||
func main() {
|
||||
TypeSwitch()
|
||||
}
|
||||
```
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
any hello is a special String!
|
||||
|
||||
<EFBFBD><EFBFBD>ϰ 11.9 simple_interface3.go<67><6F>
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ11.2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> `gI` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD> `Simpler` <20><><EFBFBD>͵IJ<CDB5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>սӿڲ<D3BF><DAB2><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>жϲ<D0B6><CFB2><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD> `Simpler` <20><><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `main` ʹ<><CAB9> `gI` ȡ<><C8A1> `fI` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>㹻<EFBFBD><E3B9BB>ȫ<EFBFBD><C8AB>
|
||||
|
||||
## 11.9.2 <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
<EFBFBD><EFBFBD> 7.6.6 <20><><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `int` <20><><EFBFBD>顢`float` <20><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD> `string` <20><><EFBFBD>飬<EFBFBD><E9A3AC>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><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> `Element`<EFBFBD><EFBFBD>`type Element interface{}`
|
||||
|
||||
Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵Ľṹ<EFBFBD><EFBFBD> `Vector`<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> `Element` <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ƭ<EFBFBD><C6AC>
|
||||
|
||||
```go
|
||||
type Vector struct {
|
||||
a []Element
|
||||
}
|
||||
```
|
||||
|
||||
`Vector` <20><><EFBFBD>ܷ<EFBFBD><DCB7>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>͵ı<CDB5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>Ͷ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>˿սӿڣ<D3BF>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD> `Vector` <20><><EFBFBD>ŵ<EFBFBD>ÿ<EFBFBD><C3BF>Ԫ<EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD><EFBFBD>Dz<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>͵ı<CDB5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> `At()` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7>ص<EFBFBD> `i` <20><>Ԫ<EFBFBD>أ<EFBFBD>
|
||||
|
||||
```go
|
||||
func (p *Vector) At(i int) Element {
|
||||
return p.a[i]
|
||||
}
|
||||
```
|
||||
|
||||
<EFBFBD>ٶ<EFBFBD>һ<EFBFBD><EFBFBD> `Set()` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> `i` <20><>Ԫ<EFBFBD>ص<EFBFBD>ֵ<EFBFBD><D6B5>
|
||||
|
||||
```go
|
||||
func (p *Vector) Set(i int, e Element) {
|
||||
p.a[i] = e
|
||||
}
|
||||
```
|
||||
|
||||
`Vector` <20>д洢<D0B4><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><D8B6><EFBFBD> `Element` <20><><EFBFBD>ͣ<EFBFBD>Ҫ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ǵ<EFBFBD>ԭʼ<D4AD><CABC><EFBFBD>ͣ<EFBFBD>unboxing<6E><67><EFBFBD><EFBFBD><EFBFBD>䣩<EFBFBD><E4A3A9>Ҫ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6>ԡ<EFBFBD>TODO<44><4F>The compiler rejects assertions guaranteed to fail<69><6C><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ִ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
<EFBFBD><EFBFBD>ϰ 11.10 min_interface.go / minmain.go<67><6F>
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>11.7<EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `Sorter` <20>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> `Miner` <20>ӿڲ<D3BF>ʵ<EFBFBD><CAB5>һЩ<D2BB><D0A9>Ҫ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `Min` <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> `Miner` <20><><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ϣ<EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>㲢<EFBFBD><E3B2A2><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ԫ<EFBFBD>ء<EFBFBD>
|
||||
|
||||
## 11.9.3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD>սӿ<D5BD><D3BF><EFBFBD>Ƭ
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> `myType` <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD>뽫<EFBFBD><EBBDAB>Ƭ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Ƶ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>սӿ<D5BD><D3BF><EFBFBD>Ƭ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ƣ<EFBFBD>
|
||||
|
||||
```go
|
||||
var dataSlice []myType = FuncReturnSlice()
|
||||
var interfaceSlice []interface{} = dataSlice
|
||||
```
|
||||
|
||||
<EFBFBD><EFBFBD>ϧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`cannot use dataSlice (type []myType) as type []interface { } in assignment`
|
||||
|
||||
ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>еIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ο<EFBFBD>[http://golang.org/doc/go_spec.html](http://golang.org/doc/go_spec.html)<29><><EFBFBD><EFBFBD>
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> `for-range` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʽ<EFBFBD>ظ<EFBFBD><D8B8>ƣ<EFBFBD>
|
||||
|
||||
```go
|
||||
var dataSlice []myType = FuncReturnSlice()
|
||||
var interfaceSlice []interface{} = make([]interface{}, len(dataSlice))
|
||||
for ix, d := range dataSlice {
|
||||
interfaceSlice[i] = d
|
||||
}
|
||||
```
|
||||
|
||||
## 11.9.4 ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD>͵Ľڵ<C4BD><DAB5><EFBFBD><EFBFBD>ݽṹ
|
||||
|
||||
<EFBFBD><EFBFBD>10.1<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>ij<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>IJ<EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>룺ͨ<EFBFBD>ö<EFBFBD><EFBFBD>塢<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>սڵ<EFBFBD><EFBFBD><EFBFBD> `NewNode` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD> `SetData` <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
ʾ<EFBFBD><EFBFBD> 11.10 node_structures.go:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Node struct {
|
||||
le *Node
|
||||
data interface{}
|
||||
ri *Node
|
||||
}
|
||||
|
||||
func NewNode(left, right *Node) *Node {
|
||||
return &Node{left, nil, right}
|
||||
}
|
||||
|
||||
func (n *Node) SetData(data interface{}) {
|
||||
n.data = data
|
||||
}
|
||||
|
||||
func main() {
|
||||
root := NewNode(nil, nil)
|
||||
root.SetData("root node")
|
||||
// make child (leaf) nodes:
|
||||
a := NewNode(nil, nil)
|
||||
a.SetData("left node")
|
||||
b := NewNode(nil, nil)
|
||||
b.SetData("right node")
|
||||
root.le = a
|
||||
root.ri = b
|
||||
fmt.Printf("%v\n", root) // Output: &{0x125275f0 root node 0x125275e0}
|
||||
}
|
||||
```
|
||||
|
||||
## 11.9.5 <20>ӿڵ<D3BF><DAB5>ӿ<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' <20><><EFBFBD>Զ<EFBFBD>̬<EFBFBD><CCAC>һ<EFBFBD>棬<EFBFBD><E6A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `Ruby` <20><> `Python` <20><>Щ<EFBFBD><D0A9>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚϡ<C8BD>
|
||||
|
||||
<EFBFBD>ٶ<EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
```go
|
||||
var ai AbsInterface // declares method Abs()
|
||||
type SqrInterface interface {
|
||||
Sqr() float
|
||||
}
|
||||
var si SqrInterface
|
||||
pp := new(Point) // say *Point implements Abs, Sqr
|
||||
var empty interface{}
|
||||
```
|
||||
|
||||
<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
|
||||
empty = pp // everything satisfies empty
|
||||
ai = empty.(AbsInterface) // underlying value pp implements Abs()
|
||||
// (runtime failure otherwise)
|
||||
si = ai.(SqrInterface) // *Point has Sqr() even though AbsInterface doesn<73><6E>t
|
||||
empty = si // *Point implements empty set
|
||||
// Note: statically checkable so type assertion not necessary.
|
||||
```
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
||||
|
||||
```go
|
||||
type myPrintInterface interface {
|
||||
print()
|
||||
}
|
||||
|
||||
func f3(x myInterface) {
|
||||
x.(myPrintInterface).print() // type assertion to myPrintInterface
|
||||
}
|
||||
```
|
||||
|
||||
`x` ת<><D7AA>Ϊ `myPrintInterface` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>̬<EFBFBD>ģ<EFBFBD>ֻҪ `x` <20>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>̬<EFBFBD><CCAC><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `print` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>þͿ<C3BE><CDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
|
||||
|
||||
- [Ŀ¼](directory.md)
|
||||
- <20><>һ<EFBFBD>£<EFBFBD>[11.8 <20>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>д](11.8.md)
|
||||
- <20><>һ<EFBFBD>ڣ<EFBFBD>[11.10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>](11.10.md)
|
@@ -102,6 +102,7 @@
|
||||
- 11.6 [使用方法集与接口](11.6.md)
|
||||
- 11.7 [第一个例子:使用Sorter接口排序](11.7.md)
|
||||
- 11.8 [第二个例子:读和写](11.8.md)
|
||||
- 11.9 [空接口](11.9.md)
|
||||
|
||||
## 第三部分:Go 高级编程
|
||||
|
||||
|
Reference in New Issue
Block a user