Помогите с передачей параметров в функцию.
От: Trener2022  
Дата: 14.06.22 16:20
Оценка:
Пытаюсь в функции поменять параметры с использованием указателей

package main
 
import (
    "fmt"
    "net/http"
)
 
type TestStruct struct {
    Number int
}
 
func myinit(resp *http.Response, teststruct *TestStruct) {
 
    webPage := "https://ya.ru"
    resp, _ = http.Get(webPage)
    fmt.Printf("resp.StatusCode = %v\n", resp.StatusCode)
 
    teststruct.Number = 100
}
 
func main() {
    var teststruct TestStruct
    teststruct.Number = 10
    fmt.Printf("teststruct.Number = %v\n", teststruct.Number)
 
    var resp http.Response
    resp.StatusCode = 400
    fmt.Printf("resp.StatusCode = %v\n", resp.StatusCode)
 
    myinit(&resp, &teststruct)
 
    fmt.Printf("teststruct.Number = %v\n", teststruct.Number)
    fmt.Printf("resp.StatusCode = %v\n", resp.StatusCode)
}


Вывод работы

teststruct.Number = 10
resp.StatusCode = 400
resp.StatusCode = 200
teststruct.Number = 100
resp.StatusCode = 400

То есть
teststruct.Number нормально поменялось внутри функции myinit и в main после работы функции имеет значение 100
resp.StatusCode внутри функции приняло значение 200 а после выхода в main опять получило значение 400
Хотя обе переменные передавались через указатели.

В чем проблема?
Re: Помогите с передачей параметров в функцию.
От: vsb Казахстан  
Дата: 14.06.22 17:11
Оценка:
Ты присваиваешь переменной resp новое значение в строчке `resp, _ = http.Get(webPage)`. После выполнения этой строчки она указывает уже на новый объект, который не имеет отношения к тому значению, которое ты передаёшь в функцию. Наверное тебе нужен указатель на указатель.
Отредактировано 14.06.2022 17:11 vsb . Предыдущая версия .
Re[2]: Помогите с передачей параметров в функцию.
От: Trener2022  
Дата: 14.06.22 17:35
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Ты присваиваешь переменной resp новое значение в строчке `resp, _ = http.Get(webPage)`. После выполнения этой строчки она указывает уже на новый объект, который не имеет отношения к тому значению, которое ты передаёшь в функцию. Наверное тебе нужен указатель на указатель.


Да, возможно.
Только вот как правильно непонято.

Хочу в myinit запихать проверки на доступность страницы, бд и т.д.
А в main уже проводить работу с загруженной страницей (resp.Body)
Вот и не ясно как правильно это сделать.
Re[3]: Помогите с передачей параметров в функцию.
От: vsb Казахстан  
Дата: 14.06.22 18:09
Оценка:
Здравствуйте, Trener2022, Вы писали:

T>Да, возможно.

T>Только вот как правильно непонято.

T>Хочу в myinit запихать проверки на доступность страницы, бд и т.д.

T>А в main уже проводить работу с загруженной страницей (resp.Body)
T>Вот и не ясно как правильно это сделать.

Проще всего просто вернуть *http.Response, если судить по этому примеру.
Re[4]: Помогите с передачей параметров в функцию.
От: Trener2022  
Дата: 14.06.22 18:54
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, Trener2022, Вы писали:


T>>Да, возможно.

T>>Только вот как правильно непонято.

T>>Хочу в myinit запихать проверки на доступность страницы, бд и т.д.

T>>А в main уже проводить работу с загруженной страницей (resp.Body)
T>>Вот и не ясно как правильно это сделать.

vsb>Проще всего просто вернуть *http.Response, если судить по этому примеру.


Есть проблема что в myinit мне несколько объектов нужно будет инициализировать и потом с ними работать в main (типа коннекта к бд — db, err = sql.Open("postgres", psqlconn))
Можно конечно забить на отдельную функцию инициализации и просто в main все вписать.
Но хочется же еще и разобраться как правильно подобные вещи передавать в функции.
Re[5]: Помогите с передачей параметров в функцию.
От: vsb Казахстан  
Дата: 14.06.22 21:12
Оценка: +1
Здравствуйте, Trener2022, Вы писали:

vsb>>Здравствуйте, Trener2022, Вы писали:


T>>>Да, возможно.

T>>>Только вот как правильно непонято.

T>>>Хочу в myinit запихать проверки на доступность страницы, бд и т.д.

T>>>А в main уже проводить работу с загруженной страницей (resp.Body)
T>>>Вот и не ясно как правильно это сделать.

vsb>>Проще всего просто вернуть *http.Response, если судить по этому примеру.


T>Есть проблема что в myinit мне несколько объектов нужно будет инициализировать и потом с ними работать в main (типа коннекта к бд — db, err = sql.Open("postgres", psqlconn))

T>Можно конечно забить на отдельную функцию инициализации и просто в main все вписать.
T>Но хочется же еще и разобраться как правильно подобные вещи передавать в функции.

Во-первых в go можно и нужно возвращать несколько значений.

Во-вторых, если их прям много, можно создать отдельную структуру-держатель этих полей.

В-третьих можно использовать вместо этой структуры стандартный класс Context. Насколько это уместно в твоём случае, не знаю, но как один из вариантов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.