В GO, использование ключевого слова DEFE позволяет функциям выполнять код во время их возврата, даже если панеки происходят. Однако, когда речь идет о переменных, объявляемых по -разному в рамках функции, результаты могут варьироваться, что приводит к путанице.
рассмотрим следующий код фрагмент:
func c(i int) int { defer func() { i }() return i } func main() { fmt.Println(c(0)) // Prints 0 }
В этом примере мы называем функцию C и передаем ее значение 0. Однако, когда мы печатаем результат, мы получаем 0, а не ожидаемое 1. Это потому, что я объявляется как входной параметр для функции. Как только оператор возврата выполняется, вызывается функция DEFE, но приращение не оказывает влияния на возвращаемое значение.
В отличие от предыдущего примера, давайте рассмотрим следующий код:
func c1() (i int) { defer func() { i }() return i } func main() { fmt.Println(c1()) // Prints 1 }
здесь, я объявлен как параметр результата для функции C1. Когда оператор возврата выполняется, значение I установлено на возвратное значение. Тем не менее, функции отсрочки все еще разрешено изменять значение I до его возврата. Это приводит к тому, что выходные данные 1.
]. defer func () {i} () возврат 2 } func main () { fmt.println (c2 ()) // Отпечатки 3 }. В результате функция DEFE увеличивает значение I, а возвращаемое значение становится 3.
func c2() (i int) { defer func() { i }() return 2 } func main() { fmt.Println(c2()) // Prints 3 }
Ключевой вывод из этих примеров - это различие между входными параметрами и именованными параметрами результата. Входные параметры передаются в функцию, в то время как именованные параметры результата являются переменными, которые содержит возвратные значения функции. Функции отложения могут изменять именованные параметры результата после выполнения оператора возврата, но они не могут влиять на входные параметры.
]Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3