Затворы и анонимные функции Golang

1. анонимная функция

анонимная функция не является функцией от имени функции, как показано ниже.

Тест FUNC () INT { 
    макс: = FUNC (а, б INT ) INT {
         если а> Ь {
             вернуть 
        } еще {
             возвращение Ь 
        } 
    } ( 3 , 4 )
     возвращение макс 
} 
FUNC Основной () { 
    primeCnt: = сделать ( чан INT , 1 ) 
    N: = 10 
    идут FUNC (N INT ) { 
        CNT: = 0 для

        я: = 2 ; я <N; я ++ {
             вар J INT 
            для J = 2 ; J <= INT (Math.sqrt (float64 (я))); J ++ {
                 если я% J == 0 {
                     перерыв 
                } 
            } , 
            если J> INT (Math.Sqrt (float64 (я))) { 
                CNT ++ 
                fmt.Println (я) 
            } 
        } 
        primeCnt <- CNT 
    } (N) 
    FMT. Println ( " totalNum: ", <-primeCnt)
}

В основном анонимные функции не являются также ничего сказать. , ,

2. Закрытие

Затворы ощущение того, что возвращаемое значение является функцией анонимной функции. , , Посмотрите на пример этого (◉3◉)

пакет основного 

импорта ( 
    " FMT " 
) 

Func квадраты () FUNC () ИНТ {
     вар х ИНТОВ 
    возврат функ () Int { 
        х ++
         вернуть х * х 
    } 
} 

Func основного () { 
    F: = квадраты () 
    fmt.Println ( F ()) 
    fmt.Println (е ()) 
    fmt.Println (е ()) 
}

Операционные результаты, как показано ниже, вы можете увидеть три вызова f (), получить другую х. Даже если х местные квадраты переменных, а переменный й жизненный цикл увеличивается до трех раз вызова функции (F ()). Почему это? Давайте посмотрим на другой случай.

пакет основного 

импорта ( 
    " FMT " 
) 

Func квадраты () FUNC () ИНТ {
     вар х ИНТОВ 
    возврат функ () Int { 
        х ++
         вернуть х * х 
    } 
} 

Func основных () { 
    е: = квадраты () 
    f1: = квадраты () 
    fmt.Println (е ()) 
    fmt.Println (е ()) 
    fmt.Println (е ()) 

    fmt.Println (f1 ()) 
    fmt.Println (f1 ()) 
    fmt.Println (f1 ()) 
}

 

Смотрите бар. Другая переменная начинается снова. Эй, эй, эй. Почему это так, одним словом, побег памяти. Что такое бегство памяти, попросту говоря, это исходные переменные в стеке и побежал к куче. Конечно, мы говорили о так просто, еще один день, чтобы написать статью, чтобы поговорить с вами бежать памяти Taijun, эй, эй, эй. Так как обнаружить программу памяти не произошло избежать. Eau идут строить инструменты. Как показано на фиг.

Из рисунка видно, что переменные й перемещаются в кучу, что также объясняет, почему х жизненный цикл может быть продлен.

 

ссылка

https://juejin.im/post/5c850d035188257ec629e73e  анализ закрытия,

«Программирования Go Язык»

https://www.do1618.com/archives/1328/go-%E5%86%85%E5%AD%98%E9%80%83%E9%80%B8%E8%AF%A6%E7%BB % 86% 88% E5% 86 % E6% 9E% 90 /  анализ побега памяти

рекомендация

отwww.cnblogs.com/dennis-wong/p/11628288.html
рекомендация