2017-09-07 7 views
-4

私は関数を実行し、変数に出力結果を返したいが、これは私の実際のコードです:同じ結果で文字列または `error`値を返すことはできますか?

package main 

import (
    "os" 
    "net/http" 
    "io" 
    "fmt" 
    "strings" 
) 


func downloadFile(url string) (err error) { 

    resp, err := http.Get(url) 
    if err != nil { 
    return err 
    } 

    // extrage numele fisierului din linkul redirectionat. 
    finalURL := resp.Request.URL.String() 
    parts := strings.Split(finalURL, "/") 
    filename := parts[len(parts)-1] 

    out, errr := os.Create(filename) 
    if errr != nil { 
    return errr 
    } 

    _, err = io.Copy(out, resp.Body) 
    if err != nil { 
    return err 
    } 

    defer out.Close() 
    defer resp.Body.Close() 

    return filename 
} 

func main() { 

    var url1 string = "https://transfer.sh/5e2iH/test.txt" 
    var filename2 string = "test test test" 

    filename2 := downloadFile(url1) 

    fmt.Println(filename2) 

} 

私は、関数downloadFileを実行し、変数FILENAME2で変数名を返す、私はイム間違ってこのエラーを返したいですか?イムPythonの開発者、愚かなエラーを作成してくださいイム:)

F:\dev\GoLang\gitlab\check>go run download.go 
# command-line-arguments 
.\download.go:37:3: cannot use filename (type string) as type error in return ar 
gument: 
     string does not implement error (missing Error method) 
.\download.go:45:13: no new variables on left side of := 
.\download.go:45:13: cannot use downloadFile(url1) (type error) as type string i 
n assignment 
+0

それだけで 'ERROR'を期待しているときは、文字列を返しています。あなたの関数は 'func downloadFile(URL文字列)(文字列、エラー)'でなければならず、 'return err'は' return ""、err'でなければならず、最終リターンは 'return nil、filename'です。 – RayfenWindspear

答えて

1

を呼び出すときにあなたのコードは、例えばやっているだけのように、エラーと返された文字列の両方をチェックする必要があります

func downloadFile(url string) (filename string, err error) { 
    ..... 
    // and since the variables are named in the signature, at the end you can just do: 
    return 
} 

する必要がありますdownloadFile()関数の文字列のように、両方の変数で作業する必要があります。 Golangは強く型付けされており、変数の型を変更できませんでした。あなたは、多型についてinterfacesを使用することができますが、この場合には、あなただけのように一緒にerrfilenameを返す必要があります。

package main 

import (
    "os" 
    "net/http" 
    "io" 
    "fmt" 
    "strings" 
) 


func downloadFile(url string) (err error, filename string) { 

    resp, err := http.Get(url) 
    defer resp.Body.Close() 

    if err != nil { 
     return 
    } 

    // extrage numele fisierului din linkul redirectionat. 
    finalURL := resp.Request.URL.String() 
    parts := strings.Split(finalURL, "/") 
    filename = parts[len(parts)-1] 

    out, err := os.Create(filename) 
    defer out.Close() 
    if err != nil { 
     return 
    } 

    _, err = io.Copy(out, resp.Body) 
    if err != nil { 
     return 
    } 

    return 
} 

func main() { 

    var url1 string = "https://transfer.sh/5e2iH/test.txt" 
    err, file := downloadFile(url1) 
    if err != nil { 
     panic(err.Error()) 
    } 
    fmt.Println(file) 

} 
1

ゴーが強くので、関数がケースに応じて、エラーまたは文字列を返すことができません、タイプされます。

幸いなことに、関数から2つの変数を返すことができます。これは、あなたが望むことを達成するための好ましい方法です。文字列とエラーを返し、存在しない場合はエラーとしてnilを返します。

関数のシグネチャは、呼び出し元関数は、あなたがerrorを使用することはできませんos.Create(filename)

+1

私の意見では、名前付きリターンを使用し、最後に裸の 'return'を持っていると、OPが新しく行くということを考えると、彼は道を混乱させる可能性があります。 – RayfenWindspear

関連する問題