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 / анализ побега памяти