Saya ingin menulis fungsi pembantu kecil untuk memusatkan panggilan HTTP saya. Berasal dari Python, saya masih kesulitan menggunakan pointer di Go.

Fungsi helper pada dasarnya mengambil struct dengan informasi panggilan (URL, metode, dan badan permintaan opsional) dan akan mengembalikan badan tanggapan sebagai []byte (untuk saat ini adalah nil):

package main

import "net/http"

type httpParameters struct {
    Url string
    Method func(client http.Client, string2 string) (*http.Response, error)
    Body []byte
}

func callHTTP(param httpParameters) (resp []byte, err error) {
    return nil, nil
}

Tes terlampir adalah

package main

import (
    "net/http"
    "testing"
)

func TestCallHTTP(t *testing.T) {
    params := httpParameters{
        Url:    "https://postman-echo.com/get",
        Method: http.Client.Get,
    }
    resp, err := callHTTP(params)
    if err != nil {
        t.Errorf("call to %v was not successful: %v", params.Url, err)
    }
    if resp != nil {
        t.Errorf("GET call to %v returned something: %v, should be nil", params.Url, resp)
    }
}

Ketika mencoba menjalankan itu saya dapatkan

.\main_test.go:11:22: invalid method expression http.Client.Get (needs pointer receiver: (*http.Client).Get)

Catatan: Method func(client http.Client, string2 string) (*http.Response, error) dalam deklarasi tipe adalah pendekatan coba-coba - saya akhirnya memasukkan apa yang ada dalam definisi Get. Saya tidak yakin ini adalah cara fungsi seperti itu harus dirujuk

Bagaimana saya harus menangani metode Get agar dapat meneruskannya dalam panggilan?

-2
WoJ 12 Mei 2021, 10:00

2 jawaban

Jawaban Terbaik

Get dideklarasikan dengan penerima pointer, yaitu *http.Client dan tidak dengan penerima nilai, yaitu tidak http.Client.

Kesalahan:

invalid method expression http.Client.Get (needs pointer receiver: (*http.Client).Get)

Mengatakan hanya itu. Dan, bahkan menyediakan bentuk ekspresi metode yang tepat, yaitu (*http.Client).Get.

Ini juga berarti bahwa tanda tangan fungsi Anda harus berubah, misalnya, ubah client http.Client menjadi client *http.Client.

type httpParameters struct {
    Url string
    Method func(*http.Client, string) (*http.Response, error)
    Body []byte
}
func TestCallHTTP(t *testing.T) {
    params := httpParameters{
        Url:    "https://postman-echo.com/get",
        Method: (*http.Client).Get,
    }
    // ...
}

https://play.golang.org/p/83qgE4QeHx5

1
mkopriva 12 Mei 2021, 08:09

http.NewRequest(method, url, body) akan membantu mencapai hal yang sama.

req, err := http.NewRequest("GET", "http://example.com", nil)
// ...
req.Header.Add("If-None-Match", `W/"wyzzy"`)
resp, err := client.Do(req)
// ...
2
Maneesh Babu M 12 Mei 2021, 07:12