defer
サブ機能を入れることは可能ですか?
つまりtest1()
、https://play.golang.org/p/evabhcjvNsのfuncの12〜16行目(以下に同封)
それらをサブ関数に入れる可能性はありますか?私が試したものと同じですtest2()
(ただし、その動作はとは異なりますtest1()
)。
私が尋ねている理由は、funcの12〜16行目test1()
で、実際のコードは永続データから変数を復元し、完了defer
時にそれを保存するために使用するためtest1()
です。ただし、全体の復元/保存が不要な場合もあるので、より良い制御方法を考えています。
ありがとう
package main
import "log"
func main() {
test1()
log.Printf("==== \n")
test2()
}
func test1() {
r, err := Open("a")
if err != nil {
log.Fatalf("error opening 'a'\n")
}
defer r.Close()
r.Use()
}
func test2() {
r := subc()
r.Use()
}
func subc() *Resource {
r, err := Open("a")
if err != nil {
log.Fatalf("error opening 'a'\n")
}
defer r.Close()
return r
}
type Resource struct {
name string
}
func Open(name string) (*Resource, error) {
log.Printf("opening %s\n", name)
return &Resource{name}, nil
}
func (r *Resource) Use() error {
log.Printf("using %s\n", r.name)
return nil
}
func (r *Resource) Close() error {
log.Printf("closing %s\n", r.name)
return nil
}
私はあなたが尋ねていることを理解していると思います。関数が呼び出し元の据え置きスタックに関数を配置できるかどうかを知りたいとします。その答えはノーです。これに対する1つの可能な解決策は、何かを延期したい関数がその関数を呼び出し元に返し、呼び出し元にを実行させることdefer
です。例えば:
func test2() {
r, cleanup := subc()
defer cleanup()
r.Use()
}
func subc() (*Resource, func()) {
r, err := Open("a")
if err != nil {
log.Fatalf("error opening 'a'\n")
}
return r, func() { r.Close() }
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加