mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-08-15 11:02:17 +00:00
make loop
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
## 6.4. 方法值和方法表達式
|
||||
|
||||
我們經常選擇一個方法,並且在同一個表達式裡執行,比如常見的p.Distance()形式,實際上將其分成兩步來執行也是可能的。p.Distance叫作“選擇器”,選擇器會返迴一個方法"值"->一個將方法(Point.Distance)綁定到特定接收器變量的函數。這個函數可以不通過指定其接收器卽可被調用;卽調用時不需要指定接收器(譯註:因爲已經在前文中指定過了),隻要傳入函數的參數卽可:
|
||||
我們經常選擇一個方法,併且在同一個表達式里執行,比如常見的p.Distance()形式,實際上將其分成兩步來執行也是可能的。p.Distance叫作“選擇器”,選擇器會返迴一個方法"值"->一個將方法(Point.Distance)綁定到特定接收器變量的函數。這個函數可以不通過指定其接收器卽可被調用;卽調用時不需要指定接收器(譯註:因爲已經在前文中指定過了),隻要傳入函數的參數卽可:
|
||||
|
||||
```go
|
||||
p := Point{1, 2}
|
||||
@@ -16,7 +16,7 @@ scaleP(3) // then (6, 12)
|
||||
scaleP(10) // then (60, 120)
|
||||
```
|
||||
|
||||
在一個包的API需要一個函數值、且調用方希望操作的是某一個綁定了對象的方法的話,方法"值"會非常實用(=_=眞是繞)。舉例來說,下面例子中的time.AfterFunc這個函數的功能是在指定的延遲時間之後來執行一個(譯註:另外的)函數。且這個函數操作的是一個Rocket對象r
|
||||
在一個包的API需要一個函數值、且調用方希望操作的是某一個綁定了對象的方法的話,方法"值"會非常實用(=_=眞是繞)。舉例來説,下面例子中的time.AfterFunc這個函數的功能是在指定的延遲時間之後來執行一個(譯註:另外的)函數。且這個函數操作的是一個Rocket對象r
|
||||
|
||||
```go
|
||||
type Rocket struct { /* ... */ }
|
||||
@@ -30,7 +30,7 @@ time.AfterFunc(10 * time.Second, func() { r.Launch() })
|
||||
```go
|
||||
time.AfterFunc(10 * time.Second, r.Launch)
|
||||
```
|
||||
譯註:省掉了上面那個例子裡的匿名函數。
|
||||
譯註:省掉了上面那個例子里的匿名函數。
|
||||
|
||||
和方法"值"相關的還有方法表達式。當調用一個方法時,與調用一個普通的函數相比,我們必鬚要用選擇器(p.Distance)語法來指定方法的接收器。
|
||||
|
||||
@@ -41,7 +41,7 @@ p := Point{1, 2}
|
||||
q := Point{4, 6}
|
||||
|
||||
distance := Point.Distance // method expression
|
||||
//譯註:這個Distance實際上是指定了Point對象爲接收器的一個方法func (p Point) Distance(),但通過Point.Distance得到的函數需要比實際的Distance方法多一個參數,卽其需要用第一個額外參數指定接收器,後面排列Distance方法的參數。看起來本書中函數和方法的區別是指有沒有接收器,而不像其他語言那樣是指有沒有返迴值。
|
||||
//譯註:這個Distance實際上是指定了Point對象爲接收器的一個方法func (p Point) Distance(),但通過Point.Distance得到的函數需要比實際的Distance方法多一個參數,卽其需要用第一個額外參數指定接收器,後面排列Distance方法的參數。看起來本書中函數和方法的區别是指有沒有接收器,而不像其他語言那樣是指有沒有返迴值。
|
||||
fmt.Println(distance(p, q)) // "5"
|
||||
fmt.Printf("%T\n", distance) // "func(Point, Point) float64"
|
||||
|
||||
|
Reference in New Issue
Block a user