2014-01-31 2 views
6

Я только начал изучать идти Ланг, и я запутался об объявлении переменных в языке идетПеременные не объявлено, внутри if..else заявления

, например, я объявляю req, er внутри если .. .else.

if strings.EqualFold(r.Method, "GET") || strings.EqualFold(r.Method, "") { 
    req, er := http.NewRequest(r.Method, r.Uri, b) 
} else { 
    req, er := http.NewRequest(r.Method, r.Uri, b) 
} 


if er != nil { 
    // we couldn't parse the URL. 
    return nil, &Error{Err: er} 
} 

// add headers to the request 
req.Host = r.Host 
req.Header.Add("User-Agent", r.UserAgent) 
req.Header.Add("Content-Type", r.ContentType) 
req.Header.Add("Accept", r.Accept) 
if r.headers != nil { 
    for _, header := range r.headers { 
     req.Header.Add(header.name, header.value) 
    } 
} 

Но у меня есть ошибка из терминала

./goreq.go:127: req declared and not used 
./goreq.go:127: er declared and not used 
./goreq.go:129: req declared and not used 
./goreq.go:129: er declared and not used 

кажется, что все, что я объявленная внутри Если заявление не работает ... Как я могу решить это?

+1

Я не знаю много о 'go', но кажется, что если вы объявите' 'req' и er' перед, если заявление и назначить их в оператор if, то предупреждения (они являются предупреждениями или фактически ошибками?) должны уходить. – jonhopkins

+0

В Go, идиоматично назвать результат ошибки 'err', а не' er' – Acidic

ответ

13

Поскольку переменные определены только в объеме, в котором они были объявлены:

package main 

import "fmt" 

func main() { 
    a := 1 
    fmt.Println(a) 
    { 
     a := 2 
     fmt.Println(a) 
    } 
    fmt.Println(a) 
} 

go play

Разница между = и := является то, что = просто назначение и := является синтаксис для объявления переменной и невязка

Этот:

a := 1 

эквивалентно:

var a int 
a = 1 

То, что вы, вероятно, хотите есть:

var req *http.Request 
var er error 
if strings.EqualFold(r.Method, "GET") || strings.EqualFold(r.Method, "") { 
    req, er = http.NewRequest(r.Method, r.Uri, b) 
} else { 
    req, er = http.NewRequest(r.Method, r.Uri, b) 
} 


if er != nil { 
    // we couldn't parse the URL. 
    return nil, &Error{Err: er} 
} 

// add headers to the request 
req.Host = r.Host 
req.Header.Add("User-Agent", r.UserAgent) 
req.Header.Add("Content-Type", r.ContentType) 
req.Header.Add("Accept", r.Accept) 
if r.headers != nil { 
    for _, header := range r.headers { 
     req.Header.Add(header.name, header.value) 
    } 
} 
+0

Спасибо за ответ, так как я могу передать переменную из области? – LiJung

+0

вам не нужно ничего пропускать, вам просто нужно объявить их в нужном месте – Arjan

+0

Спасибо! это то, что я хочу! Я приму ответ. Спасибо за помощь!! – LiJung

1

Это потому, что вы объявили переменные req и er внутри условия if else и пытаются использовать его вне сферы действия (область - это только if и else, внутри которых они объявлены).

Вы должны объявить er и req вне if else

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