4

簡単なgoプログラム(基本的には単なるサンプルコード)を作成しました:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func getPage(url string) (body []byte, err error) {
    resp, err := http.Get(url)

    body = nil

    if (err != nil) {
        return
    }

    defer resp.Body.Close()
    body, err = ioutil.ReadAll(resp.Body)

    return
}

func main() {
    startUrl := "http://slashdot.org/"

    body, err := getPage(startUrl)

    if (err != nil) {
        fmt.Println("Error: " , err)
    }

    fmt.Println(body)
}

ドキュメントを調べて、すべてがどのように組み合わされているかを理解しようとしています。

最初の問題:http.Get()。ドキュメント(http://golang.org/pkg/net/http/)にはありません。それを除いて、しかし応答の下で。ただし、他に2つのGet()関数があります。net / http.Getが実際にResponseタイプのGet()であることをどうやって知ることができますか?

とにかく、http.Get()はの応答を返しBodyますio.ReadCloser。ioutil.ReadAll()はio.Readerを取りますが、これをパラメーターとして受け入れる他の関数を見つけるにはどうすればよいですか?ドキュメントは「逆方向」のようです。必要な関数がわかっている場合はドキュメントを見つけることができますが、タイプがある場合は、どの関数がそれで機能するかをどのように見つけることができますか?

4

2 に答える 2

7

関数は次のように定義されます:

func (c *Client) Get(url string) (resp *Response, err error)
func (h Header) Get(key string) string
func Get(url string) (resp *Response, err error)

関数がどのように宣言されているかをご覧ください。

func関数の名前()との間Getには、レシーバーのタイプと名前(括弧の間)があります。これらの関数の1つだけにレシーバーがなく、パッケージ名()をプレフィックスとして直接呼び出す必要がありますhttp。それはあなたが必要とするものです。

于 2013-03-15T13:48:10.903 に答える
0

あなたio.Readerio.ReadCloser質問について:

これらはインターフェースです。慣れていない場合は、ここで読んでください。

インターフェイスは基本的にメソッドのセットであり、これら2つは次のように定義されています。

type Reader interface{
     Read([]byte)(int, error)
}

type ReadCloser interface{
     Read([]byte)(int, error)
     Close()
}

これは、上記のシグネチャを持つReadメソッドを持つ具体的なデータ型をio.Readerとして渡すことができることを意味します。io.ReadCloserを満たすデータ型は、Readメソッドと追加のcloseメソッドを提供する必要があるため、これを確実に実行します。

したがって、ReadCloserをReaderとして渡すだけです。

インターフェースは非常に暗黙的であるため、最初はインターフェースがどのように機能するかを理解するのは少し難しいですが、非常に強力であり、多くの可能性を提供します。上でリンクしたテキストを必ず読んでください。私がgoから始めたとき、私はすべてを読み下ろしました、そしてそれは物事をずっと簡単にしました。

于 2013-06-18T16:48:53.767 に答える