Oleg
Рассказывать новичку про interface{} - это вы конечно молодцы :)
Vladimir
https://play.golang.org/p/ht7-coMLaL
Nikita
Oleksii
Что именно не понятно?
Vladimir
a := "бла" // присваиваем a значение бла
Nikita
при коротком синтаксе объявления переменной тип полностью копируется из значение которое передали?
Nikita
var t T
t := T{} одно и тоже так?
Vladimir
b := &a // берем адрес а, присваиваем в б
Vladimir
c := *b // присваиваем значение а в с
Vladimir
так понятнее, без структур и прочей требухи?
Nikita
хм
Sergey
где лежит такое то значение
Vladimir
хм
https://play.golang.org/p/SXpAUugMhj
Nikita
указатель на значение
указатель на его операнд
Vladimir
запусти
Vladimir
посмотри результат
Nikita
а
Vladimir
так понятнее?
Vladimir
убрав структуры и implicit pointers, etc
Nikita
& возвращает адрес в памяти по переменной
* возращает значение по адресу в памяти
Vladimir
йес
Vladimir
точную терминологию ща вон @heyyyoyy подправит если шо, я с русскими терминами программирования не силен
Nikita
аааа, вот зачем нужно использовать постоянно * если сделал &
Vladimir
постоянно это если тебе надо само значение
Vladimir
а если тебе надо например передать поинтер как параметр функции, то просто передаешь саму переменную
Oleg
Я одну мнемонику слышал про * и &, мне помогла. Хотя сейчас уже подзабыл.
* - это значок сноски. Когда видишь в тексте звездочку, значит за ней что-то скрывается. Так и в коде, с помощью * мы получаем то, что скрывается за указателем.
& - это "and". Когда мы используем его в коде, мы как бы спрашиваем у переменной: "aaaaand where do you live?". И она дает свой адрес.
Vladimir
гыгы
Vladimir
не слышал такого
Nikita
хм, интересно
Nikita
Sergey
да тут без мнемоник просто надо понять что & адрес в памяти * указатель на адрес памяти а данном случае
Vladimir
теория указателей прийдет по мере написания чего-нить практического
Oleg
Vladimir
100% еще 50 раз к этому вернешься с матюками и несовпадением типов в процессе 🙂
Oleg
Например, нужно помнить, что звездочка ставится при объявлении указателя (*T), а амперсанд при инициализации (&T{})
Nikita
я почему-то считал
типо p := &a
и я просто скопировал ссылку в переменную p, а потом когда я просто вызываю p то получаю уже значение
Vladimir
нене
Vladimir
при вызове р ты получаешь тот же адрес
Vladimir
*р - значение
Vladimir
опять же, см. тут: https://play.golang.org/p/SXpAUugMhj
Vladimir
b := &a fmt.Println(b) дает 0x1040c108
Vladimir
и никак не bla
Vladimir
вот пример без третьей переменной: https://play.golang.org/p/tlmcFYvLQ6
Oleksii
Oleksii
Потому что есть два разных кейса использования *
Sergey
Vladimir
& возвращает *тип 😄
Nikita
v := &Vertex{3, 4}
fmt.Printf("Before scaling: %+v, Abs: %v\n", v, v.Abs())
почему тут v я вижу как значение в fmt.Printf(), а не ссылку?
Oleksii
Первый - чтобы показать, что переменная есть указателем на тип - var t *T
Второй - разименовывание указателя - a := *t
Vladimir
потому что %v -- value
Vladimir
оно рекурсивно лезет по всем указателям, дабы добыть тебе значения и напечатать
Nikita
а
Vladimir
или не рекурсивно, тут вот не помню, если честно. но по крайней мере first-level value оно тебе достает за тебя
Vladimir
причем само разбирается - указатель, не указатель, и т.д.
Nikita
Nikita
типо достает значение из адреса?
Nikita
поэтому разименовывание называется?
Nikita
т.е. достает то, что скрыто под p?
Vladimir
на самом деле именно поэтому я и не люблю называть это по-русски 🙂
Vladimir
reference & dereference
Vladimir
никаких тебе изъебов с переводами
Oleg
Oleksii
Nikita
ясно, интересная игра слов
Nikita
вроде все понял, спасибо всем.
Nikita
когда только начал изучать, мне указатели не вызывали так сильно вопросов, а потом понял, что я абсолютно их не понял
Vladimir
это довольно essential
Oleksii
Жаль, что мне 2 года назад так никто не разложил по полочкам. Надо было вникать в тонкости С и С++ самому :)
Vladimir
можно без понимания сначала рубить с плеча пока не заработает, но разобраться не мешает. в принципе оно не сложно
Oleksii
Хотя это быстро понимается, если с этим много работать
Oleksii
В первое время меня разве что семантика * путала
Vladimir
именно. почему я и говорю, надо писать что-то. То, что тут сейчас разжевали все, через 2 дня при первом использовании опять заедет в стену 🙂
Vladimir
пока на практике не будет зазубрено
Oleksii
Особенно, когда на первой лекции - знакомстве з указателями - показывали код реализации Linked List на С++ :)
Vladimir
препода в топку
Vladimir
это ж какой нацист показывает linked list на первом занятии? 😄
Oleg