Изменить тип переменной на основе оператора switch - PullRequest
0 голосов
/ 28 октября 2018

Я нахожусь в процессе создания функции запроса HTTP POST в Go, которая будет принимать различные типы данных через параметр, но я застрял при назначении значения из оператора switch переменной requestData.

В идеале, requestData будетиметь тип nil, пока мы не перейдем к оператору switch, а затем присвоим ему значение и тип.Любая помощь приветствуется:)

Сообщение об ошибке в requestData: «синтаксическая ошибка: непредвиденный тип, ожидаемый тип»

Мой код:

main() {
    ..

    // CASE 1: we are passing the form of url.Values type
    form := url.Values{}
    form.Add("note", "john2424")
    form.Add("http", "clear")

    response := POST("www.google.co.uk", client, form) // first POST request



    // CASE 2: we are passing the JSON data using []byte type
    jsonData := []byte(`{"ids":[12345]}`)
    response := POST("www.google.co.uk", client, jsonData) // second POST request
}

func POST(website string, client *http.Client, data interface{}) (bodyString string) {
    var requestData type // <<<<<<< Change requestData to a variable from switch case 

    switch data.(type) { // switch case based on type 
    case url.Values: // URL form data
        formattedData := data.(url.Values) // convert interface to url.Values
        requestData := strings.NewReader(formattedData.Encode()) // *Reader type
    case []byte: // JSON
        formattedData := data.([]byte) // convert interface to []byte
        requestData := bytes.NewBuffer(formattedData) // *Buffer type
    default: // anything else

    }

    request, err := http.NewRequest("POST", website, requestData)
    if err != nil {
        log.Fatal(err)
    }


    response, err := client.Do(request)
    if err != nil {
        log.Fatal(err)
    }

    defer response.Body.Close()
    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatal(err)
    } else {
        bodyString = string(body)
    }

    return
}

1 Ответ

0 голосов
/ 28 октября 2018

введите введенные данные в коммутатор

typedData:=switch data.(type) {

, а затем используйте их для преобразования, например,

case []byte: // JSON
        requestData := bytes.NewBuffer(typedData) // *Buffer type

Хотя пример игровой площадки @mkopriva выглядит лучше,

...