Oleksii
Но ты это уже понял :)
Vladimir
если непривычно, пиши развернуто для начала
Vladimir
привыкнешь, будешь сокращать. никто ж не мешает 🙂
Nikita
?
Nikita
в смысле развернуто?
Nikita
type T struct {
S string
}
объявил структуру и через литерал T{} создаю ее, нет?
Oleksii
Можешь ещё создавать через var, и потом каждое поле менять :)
Oleksii
Или именовать поля структуры
Vladimir
package main
import (
"fmt"
)
func main() {
var bla struct {
ble string
}
bla.ble = "blip"
fmt.Printf("%v", bla)
}
Oleksii
t := T{name: "name"}
Vladimir
это если совсем развернуто
Nikita
Nikita
в js, можно объявить доступим класс
class MyClass {}
Oleksii
Или:
var t T
t.name = "name"
Nikita
но на самом деле это просто функция
Nikita
к которой я уже могу обращаться через MyClass переменную
Vladimir
в go вместо классов структуры 🙂
Nikita
хм, тогда вернусь еще раз вот к этой штуке.
var t *T
тут *T это указатель, так тут ничего не создается, то мне возвращается nil, но так как я указал, что тип у переменной может быть только T, то получается, что присваивать в нее могу только T ?
Vladimir
yep
Nikita
типизированный nil, как выше говорили
Nikita
ясно
Vladimir
ясно
https://play.golang.org/p/y6nYLYNSQA
Nikita
а как потом в t что-то назначить?
Nikita
t = T{"hello"}
Nikita
даже такое не работает
Oleg
t = &T{"hello"}
Oleg
Потому что нужен указатель
Nikita
ааа
Nikita
var t *T это означает что принимает указательни только такого типа
Vladimir
> var t *T
тип t = указатель на переменную типа T
Vladimir
из-за чего будет послан лесом
Nikita
и получается наоробот не могу сделать
Oleksii
Можешь
Nikita
блин, я могу даже указывать, что я ожидаю в переменную указатель или значение
Vladimir
наоборот как раз можешь 🙂
Slava
Nikita
func main() {
var t T
t = &T{"hello"}
}
Nikita
tmp/sandbox530703231/main.go:23: cannot use T literal (type *T) as type T in assignment
Oleksii
Ну не так :)
Vladimir
Oleksii
Vladimir
https://play.golang.org/p/o3sfaQYFsK
Oleksii
В твоём случае - это T
Slava
a := &B{}; b := &a - это указатель на указатель
Oleksii
Vladimir
как говорили мне на работе в 90х годах... *а - хорошо, **а - объясни, ***а - протрезвей, ****а - уволен нахрен
Slava
ну грубо говоря указатель на слайс или map, это почти указатель на указатель
Oleksii
Oleksii
А не наоборот
Slava
А потом люди удивляются, что требуются программисты с образованием высшим =)
Slava
всё это проходят на первом курсе университета
Vladimir
@eddimensi а как насчет такого: https://play.golang.org/p/TQgfhUkHEe
Vladimir
😄
Nikita
так я про это и говорю, если я выставил переменной t T, значит я не могу ей присвоить ссылку &T{}, но могу присвоить значение и наоборот, нет?
Vladimir
посмотри и никогда так на практике не делай 🙂
Nikita
Oleg
Nikita
и получается наоробот не могу сделать
Nikita
Можешь
Nikita
я просто походу тебя не правильно понял @alexsadliak
Vladimir
или даже так: https://play.golang.org/p/6d1c1E1B5P
Nikita
Vladimir
вот тебе и вся система типов 😉
Oleksii
Можешь
Можно вот так:
t := T{"a"}
p := &T{"b"}
t = *p // ok
Oleksii
Я о таком говорил
Nikita
wtf?
Nikita
а
Nikita
понял
Nikita
или нет
Nikita
Oleg
Можно взять указатель на значение.
И можно взять значение по указателю.
Так преобразовываются T и *T друг в друга.
Oleksii
Берешь значение по адресу, который хранится в указателе p и присваиваешь его в переменную t
Vladimir
потому что в t ты присваиваешь значение, находящееся по адресу p
Oleksii