2016-12-03 3 views
1

Можно ли поставить defer в подфункцию?Go, можно ли отложить в sub func

Т.е., для линии 12 ~ 16 из FUNC test1() в https://play.golang.org/p/evabhcjvNs (прилагается ниже)

Есть ли возможность поместить их в суб функции? Как и то, что я пробовал в test2() (но это поведение отличается от test1()).

Причина, почему я спрашиваю, что, по линии 12 ~ 16 из FUNC 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 
} 

ответ

5

Я думаю, я понимаю, что вы просите. Вы хотите знать, может ли функция помещать функцию в стек отложенного вызова вызывающего. Ответ на это - нет. Одно из возможных решений заключается в том, чтобы иметь функцию, которая хочет отложить что-то, вернуть эту функцию вызывающему абоненту и вызвать вызывающего абонента 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() } 
} 
Смежные вопросы