3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
推遲陳述
“ defer”語句調(diào)用一個(gè)函數(shù),該函數(shù)的執(zhí)行被推遲到周圍函數(shù)返回的那一刻。
DeferStmt =“ defer”表達(dá)式。
表達(dá)式必須是函數(shù)或方法調(diào)用。每次執(zhí)行“ defer”語句時(shí),都會對函數(shù)調(diào)用的參數(shù)進(jìn)行評估并重新保存,但不會調(diào)用該函數(shù)。延遲的函數(shù)調(diào)用將在周圍函數(shù)返回之前立即以LIFO順序執(zhí)行,但是在對返回值(如果有)進(jìn)行求值之后才執(zhí)行。
lock(l);
defer unlock(l); // unlocking happens before surrounding function returns
// prints 3 2 1 0 before surrounding function returns
for i := 0; i <= 3; i++ {
defer fmt.Print(i);
}
更新:
defer現(xiàn)在也處理慣用方式panic在例外樣方式:
package main
import "fmt"
func main() {
f()
fmt.Println("Returned normally from f.")
}
func f() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
fmt.Println("Calling g.")
g(0)
fmt.Println("Returned normally from g.")
}
func g(i int) {
if i > 3 {
fmt.Println("Panicking!")
panic(fmt.Sprintf("%v", i))
}
defer fmt.Println("Defer in g", i)
fmt.Println("Printing in g", i)
g(i+1)
}

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
Go對象文件實(shí)際上包含明文標(biāo)題:
jurily@jurily ~/workspace/go/euler31 $ 6g euler31.go
jurily@jurily ~/workspace/go/euler31 $ cat euler31.6
amd64
exports automatically generated from
euler31.go in package "main"
import
$$ // exports
package main
var main.coin [9]int
func main.howmany (amount int, max int) (? int)
func main.main ()
var main.initdone· uint8
func main.init ()
$$ // local types
type main.dsigddd_1·1 struct { ? int }
$$
!
<binary segment>

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊
我看到幾個(gè)人抱怨“ for-loop”,類似“為什么i = 0; i < len; i++在這個(gè)時(shí)代必須說?”。
我不同意,我喜歡for結(jié)構(gòu)。如果愿意,可以使用長版本,但是慣用的Go是
var a = []int{1, 2, 3}
for i, v := range a {
fmt.Println(i, v)
}
該for .. range構(gòu)造在所有元素上循環(huán)并提供兩個(gè)值-索引i和值v。
range 也適用于地圖和頻道。
不過,如果您不喜歡for任何形式,則可以在以下幾行中定義each,map等等:
type IntArr []int
// 'each' takes a function argument.
// The function must accept two ints, the index and value,
// and will be called on each element in turn.
func (a IntArr) each(fn func(index, value int)) {
for i, v := range a {
fn(i, v)
}
}
func main() {
var a = IntArr([]int{2, 0, 0, 9}) // create int slice and cast to IntArr
var fnPrint = func(i, v int) {
fmt.Println(i, ":", v)
} // create a function
a.each(fnPrint) // call on each element
}
印刷
0 : 2
1 : 0
2 : 0
3 : 9
我開始非常喜歡Go :)
- 3 回答
- 0 關(guān)注
- 273 瀏覽
添加回答
舉報(bào)