Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
9 / 7 / 3
Регистрация: 25.06.2009
Сообщений: 396

Экземпляр структуры ссылка или значение

12.02.2024, 17:33. Показов 1179. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Go
1
a := TestSct{}
или
Go
1
a := &TestSct{}
В каких случаях какой способ определения экземпляра использовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2024, 17:33
Ответы с готовыми решениями:

Невозможно найти или открыть PDB-файл. Ссылка на объект не указывает на экземпляр объекта
Выручайте, товарищи! Вчера вылезла очередная напасть в программуле: При попытке отсортировать записи в любом ДатаГриде проекта (кликом...

Ссылка и экземпляр объекта
namespace monolife { public partial class GoodGame : Form { public static int c = 0; int p;//...

Ссылка на экземпляр класса
Здравствуйте, мой вопрос состоит в следующем: Есть два экземпляра некоего класса и в ходе работы программы через консоль вводятся...

13
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
13.02.2024, 06:55
Nesh, Для небольших неизменяемых структур предпочтительное значение, для больших и изменяемых поинтер.

Добавлено через 22 минуты
https://go.dev/tour/methods/8 так чтобы это не только моим мнением казалось.
2
9 / 7 / 3
Регистрация: 25.06.2009
Сообщений: 396
13.02.2024, 08:11  [ТС]
Так там написано про передачу экземпляра в функцию, а я спросил про инициализацию экземпляра.
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
13.02.2024, 08:51
Nesh, Извините на понял сразу, Используйте первый способ если вы хотите инициализировать переменную экземпляром структуры, и не используете второй способ, так как таким образом вы инициируете переменную пойнтером на экземпляр структуры,
0
 Аватар для voraa
1268 / 1233 / 182
Регистрация: 21.01.2024
Сообщений: 5,669
13.02.2024, 09:39
Да тут без разницы. В любом случае создастся и проинициализируется структура.
Только в первом случае a будет сама структура, а во втором случае структура создастся где то в куче, а в a будет указатель на нее.
Что лучше, зависит от того, как потом эта структура будет использоваться.
0
9 / 7 / 3
Регистрация: 25.06.2009
Сообщений: 396
13.02.2024, 10:37  [ТС]
Так я и спросил в каких случаях нужно использовать первый способ а в каких второй)
0
 Аватар для voraa
1268 / 1233 / 182
Регистрация: 21.01.2024
Сообщений: 5,669
13.02.2024, 11:04
Как по мне, так вообще без разницы. Только, что если структура создается в функции, то в первом случае, она создастся в стеке, размер которого, хоть и большой, но меньше, чем куча.
Все остальное одинаково, на мой взгляд. Если структура меняется в какой то функции, и там параметр объявлен, как указатель, то всегда можно передать &a. А если к структуре приписать метод, где она объявлена через указатель, то компилятор сам разберется, что передавать структуру или указатель.
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
13.02.2024, 11:08
Go: передача значений VS передача указателей рекомендую к прочтению
0
9 / 7 / 3
Регистрация: 25.06.2009
Сообщений: 396
13.02.2024, 11:40  [ТС]
Цитата Сообщение от alhaos Посмотреть сообщение
Go: передача значений VS передача указателей рекомендую к прочтению
Я знаю каких случаях в функцию/метод передавать параметры по значению а в каких по ссылке. Прочитайте пожалуйста вопрос.
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
13.02.2024, 11:56
Цитата Сообщение от Nesh Посмотреть сообщение
В каких случаях какой способ определения экземпляра использовать?
что тут читать?!

Экземпляр структуры ссылка или значение почитайте мой ответ.

В обоих случая инициируется одна и та же структура в памяти, различия, что у вас в переменной или сама структура или поинтер на структуру. Хотите структуру первый вариант, хотите поинтер второй вариант.

Добавлено через 5 минут
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
 
import "fmt"
 
type TestSct struct {
}
 
func main() {
    a := TestSct{}
    b := &TestSct{}
 
    fmt.Printf("%T, %p\n", a, a)
    fmt.Printf("%T, %p", b, b)
}
Code
1
2
main.TestSct, %!p(main.TestSct={})
*main.TestSct, 0x1166320
Добавлено через 3 минуты
суть вопроса сводится к тому что лучше "морковка" или "вдохновение"
0
 Аватар для voraa
1268 / 1233 / 182
Регистрация: 21.01.2024
Сообщений: 5,669
13.02.2024, 12:01
Это абсолютно все равно.
Если при работе со структурой ее надо будет часто передавать по значению, то сделайте
Go
1
2
3
4
5
6
7
a := TestSct{}
// передавайте 
foo(a)
// а если сделать 
b:=&TestSct{}
// то каждый раз придется передавать
foo(*b)
И наоборот.
Как удобнее, так и делайте.
0
9 / 7 / 3
Регистрация: 25.06.2009
Сообщений: 396
13.02.2024, 13:22  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
b:=&TestSct{}
// то каждый раз придется передавать
foo(*b)
а что мне мешает сделать так:
Go
1
2
b:=TestSct{}
foo(&b)
0
651 / 404 / 76
Регистрация: 21.09.2008
Сообщений: 1,396
18.02.2024, 16:26
Цитата Сообщение от voraa Посмотреть сообщение
если структура создается в функции, то в первом случае, она создастся в стеке, размер которого, хоть и большой, но меньше, чем куча.
Насколько мне известно, в Си это именно так обстоит, в Go не совсем так. Если структура была создана локально в функции и по окончании её работы передан указатель на неё, то структура размещается в куче и поступает в распоряжение сборщика мусора (GC). Память будет освобождена GC, когда указатель на структуру станет nil.
0
366 / 330 / 83
Регистрация: 17.04.2022
Сообщений: 1,086
Записей в блоге: 8
05.03.2024, 19:49
Цитата Сообщение от sharpey Посмотреть сообщение
Если структура была создана локально в функции и по окончании её работы передан указатель на неё, то структура размещается в куче
кстати, на глаза попалась оф.документация по этому вопросу. привожу ссылку для тех, кому интересно
https://tip.golang.org/src/cmd... /escape.go

попутно, для тех, кто использует VSCode, в статье https://landontclipp.github.io... ghlighting описывается настройка стандартного гошного плагина, позволяющая подсвечивать "убежавшие" переменные и делается разбор некоторых ситуаций
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.03.2024, 19:49
Помогаю со студенческими работами здесь

Ссылка на обьект не указывает на экземпляр
Imports System Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms Public Class Form1 ...

Ссылка на объект не указывает на экземпляр?
Тема стара как мир, но я еще не в теме:-| Потому и вопрос. Используется библиотека modbus4. Хотел всю реализацию упаковать в класс. ...

Ссылка не указывает на экземпляр объекта
Доброго времени суток. В программе используется List(храниться в Program, Group - самописный класс): static public List<Group>...

Ссылка не указывает на экземпляр объекта
Есть класс для зашифровки и дешифровке текста при зашифровке(GenText("Ё")) - все нормально но при дешифровки...

Ссылка на экземпляр класса в DLL
Написал маленький каркасик для собственново фреймворка, и проблема возникла когда хотель экспортировать его в DLL. Фреймворк предпологает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru