Требуется ли закрыть тело ресурса для ответа golang http? [Дубликат]

Вы можете использовать функции empty () и isset (). Если вы хотите, чтобы он работал с разными файлами, просто измените action='yourphp.php' на html, который я вам даю, и store the PHP script на этот файл yourphp.php. Также вам нужно изменить index.html на index.php, чтобы активировать функции PHP.

PHP

<?php

    error_reporting(0);
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = 'contact@yoursite.com'; 
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";


    if ($_POST['submit']){
                if (!(empty($_POST['name']))) {
                        if (!(empty($_POST['email']))){
                            if (!(empty($_POST['message']))){
                                mail ($to, $subject, $body, $from);
                                echo '<p>Your message has been sent!</p>';
                            }else{
                                echo '<p>Fill your message please.</p>';}
                        }else {
                            echo '<p>Fill your email please.</p>';}
                }else{
                    echo '<p>Fill your name please.</p>';}              
    }else{
            echo '<p>Fill the form.</p>';}
?>

HTML

<html>
    <form method="post" action="?">
        <table>
            <tr><td>Name</td><td><input type='text' name='name' id='name'/></td></tr>
            <tr><td>Email</td><td><input type='text' name='email' id='email'/></td></tr>
            <tr><td>Message</td><td><input type='text' name='message' id='message'/></td></tr>
            <tr><td></td><td><input type='submit' name='submit' id='submit'/></td></tr>
        </table>
    </form>
</html>

С наилучшими пожеланиями!

2
задан fannheyward 18 April 2016 в 08:15
поделиться

1 ответ

http.Client не требует специального способа освобождения «используемых» ресурсов. Когда он становится недоступным, память, используемая им, будет возвращена сборщиком мусора.

http.Client не хранит информацию о соединении или состоянии. В документации даже указано, что http.Client следует использовать повторно:

Транспорт клиента обычно имеет внутреннее состояние (кэшированные TCP-соединения), поэтому клиенты следует повторно использовать, а не создавать по мере необходимости. Клиенты безопасны для одновременного использования несколькими goroutines.

Если вы создаете свой собственный клиент, используя (например, встраивание) http.Client, и выделяете ресурсы, которые должны быть выпущены явно, укажите свой собственный Close() на нем и документировать, что любой, кто использует вашу собственную реализацию, должен называть Close(), если он больше не нужен.

Примечание:

Что вы можете смутить, так это то, что если вы используете http.Client для выполнения HTTP-операций (например, Client.Do() , Client.Get() , Client.Post() и т. д.), они возвращаются значение *http.Response , и этот ответ содержит соединение, состояние и другие ресурсы, которые необходимо освободить, как правило, через Response.Body.Close(). Вывод из документа doc пакета http:

Клиент должен закрыть тело ответа, когда закончил с ним:

resp, err := http.Get("http://example.com/")
if err != nil {
  // handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...

Он также документирован в Client.Get():

Когда err равно nil, resp всегда содержит non-nil resp.Body. Caller должен закрыть resp.Body, когда он будет читать.

8
ответ дан icza 21 August 2018 в 10:29
поделиться
  • 1
    Клиент не нуждается в специальном вызове функции, но если используется response.Body (результат вызова Do или Get / Post / ...), вы должны закрыть его с помощью resp.Body.Close() – fzerorubigd 18 April 2016 в 10:08
  • 2
    @fzerorubigd Но это не метод http.Client, и он не имеет ничего общего с http.Client. Он не освобождает ресурсы, связанные с http.Client, а ресурсы, связанные с соединением. – icza 18 April 2016 в 10:15
  • 3
    Я знаю. и я это сказал. но это обычная ошибка при использовании http.Client в любом случае (это делается один раз), и я думаю, что это неплохая идея упомянуть об этом здесь :) – fzerorubigd 18 April 2016 в 10:33
Другие вопросы по тегам:

Похожие вопросы: