一條go語句就意味著並發執行一個函數。當迴圈迭代執行go語句時,要注意參數傳遞常見的一個疏忽。
如下:
| 代碼如下 |
複製代碼 |
|
package main
import (
"fmt"
"time"
)
func main() {
langs :=[]string {"java", "php", "golang"}
for _,lang := range langs {
go func() {
fmt.Println(lang)
}()
}
time.Sleep(time.Second)
} |
結果列印的全是golang字串,跟我們預期不一樣。
這是因為每次迭代都會給變數lang賦值,當迭代完畢後,3個goroutine還沒有執行,當執行是而變數lang的值是最後一次迭代的值。
如果不想使用外部變數,可以通過添加參數:
| 代碼如下 |
複製代碼 |
|
func main() {
langs :=[]string {"java", "php", "golang"}
for _,lang := range langs {
go func(lang string) {
fmt.Println(lang)
}(lang)
}
time.Sleep(time.Second)
} |
以下是交換函數 swap() 使用了引用傳遞:
/* 定義交換值函數*/
| 代碼如下 |
複製代碼 |
|
func swap(x *int, y *int) {
var temp int
temp = *x /* 保持 x 地址上的值 */
*x = *y /* 將 y 值賦給 x */
*y = temp /* 將 temp 值賦給 y */
} |
以下我們通過使用引用傳遞來調用 swap() 函數:
| 代碼如下 |
複製代碼 |
|
package main
import "fmt"
func main() {
/* 定義局部變數 */
var a int = 100
var b int= 200
fmt.Printf("交換前,a 的值 : %d\n", a )
fmt.Printf("交換前,b 的值 : %d\n", b )
/* 調用 swap() 函數
* &a 指向 a 指標,a 變數的地址
* &b 指向 b 指標,b 變數的地址
*/
swap(&a, &b)
fmt.Printf("交換後,a 的值 : %d\n", a )
fmt.Printf("交換後,b 的值 : %d\n", b )
}
func swap(x *int, y *int) {
var temp int
temp = *x /* 儲存 x 地址上的值 */
*x = *y /* 將 y 值賦給 x */
*y = temp /* 將 temp 值賦給 y */
} |
以上代碼執行結果為:
交換前,a 的值 : 100
交換前,b 的值 : 200
交換後,a 的值 : 200
交換後,b 的值 : 100