func assignsTo(x *ast.Ident, scope []ast.Stmt) bool {
	assigned := false
	ff := func(n interface{}) {
		if assigned {
			return
		}
		switch n := n.(type) {
		case *ast.UnaryExpr:
			// use of &x
			if n.Op == token.AND && refersTo(n.X, x) {
				assigned = true
				return
			}
		case *ast.AssignStmt:
			for _, l := range n.Lhs {
				if refersTo(l, x) {
					assigned = true
					return
				}
			}
		}
	}
	for _, n := range scope {
		if assigned {
			break
		}
		walk(n, ff)
	}
	return assigned
}
func assignsTo(x *ast.Ident, scope []ast.Stmt) bool {
	assigned := false
	ff := func(n interface{}) {
		if assigned {
			return
		}
		switch n := n.(type) {
		case *ast.UnaryExpr:
			
			if n.Op == token.AND && refersTo(n.X, x) {
				assigned = true
				return
			}
		case *ast.AssignStmt:
			for _, l := range n.Lhs {
				if refersTo(l, x) {
					assigned = true
					return
				}
			}
		}
	}
	for _, n := range scope {
		if assigned {
			break
		}
		walk(n, ff)
	}
	return assigned
}
func assignsTo ( x * ast . Ident , scope [ ] ast . Stmt ) bool { assigned := false ff := func ( n interface { } ) { if assigned { return } switch n := n . ( type ) { case * ast . UnaryExpr : // use of &x if n . Op == token . AND && refersTo ( n . X , x ) { assigned = true return } case * ast . AssignStmt : for _ , l := range n . Lhs { if refersTo ( l , x ) { assigned = true return } } } } for _ , n := range scope { if assigned { break } walk ( n , ff ) } return assigned }
// assignsTo returns true if any of the code in scope assigns to or takes the address of x.
assignsTo returns true if any of the code in scope assigns to or takes the address of x .