2016-03-22 2 views
1

см тестового кода:закрытие golang (анонимно) функция уловы неправильно parameter`s значение

package main 

import "fmt" 

func main() { 
    i := 10 

    closure1 := func() { 
     fmt.Printf("closure, i: %d\n", i) 
     i = 15 
    } 

    closure1() 

    fmt.Printf("in main, i: %d\n", i) 

    closure2 := func(x int) { 
     fmt.Printf("function call, pass parameter, i: %d\n", x) 
    } 

    i = 20 

    closure1() 
    closure2(i) 
} 

Я думаю, что выход closure2 должен быть 20, но реальный результат 15, я не знаю, почему? ??? Кто-нибудь может мне помочь, пожалуйста, просмотрите мой комментарий в моем коде, спасибо заранее.

+1

'i' назначается 15 в конце' закрытия1', который вы вызываете перед вызовом 'clos2'. Итак, вы передаете 15 на 'clos2' –

+0

[Ловушки с закрытием в пути] (http://www.goinggo.net/2014/06/pitfalls-with-closures-in-go.html) –

+0

я вижу, закрытие голанга ссылка на i, а не снимок, я получаю его, большое спасибо. – scott

ответ

1

Проблема заключается в том, что ваш первый присвоившей я 15, когда ваш вызов closure1() А затем закрытие два печать это .. Вы делаете closure1()после назначения I 20 .. То проблема, это должно решить проблему:

package main 

import "fmt" 

func main() { 
    i := 10 

    closure1 := func() { 
     fmt.Printf("closure, i: %d\n", i) 
     i = 15 
    } 

    closure1() 

    fmt.Printf("in main, i: %d\n", i) 

    closure2 := func(x int) { 
     fmt.Printf("function call, pass parameter, i: %d\n", x) 
    } 



    closure1() 
    i = 20 // Now it assigns it back to 20.. So the result below will become 20... 
    closure2(i) 
} 

Вы видите вашу проблему?

+0

да, в сущности, \t golang замыкание поймать ссылку на i, а не снимок, я получаю его, спасибо john и dsafds снова, кстати, «\t Ловушки с закрытием в Go» - это хороший учебный материал. – scott

0

Последняя строка замыкания1 устанавливает i в 15. Это i относится к основному() контексту.

Рядом с последней строкой основных вызовов замыкание1() снова. Таким образом, i из main снова устанавливается на 15.

Смежные вопросы