Oleksii
Есть и хорошие, но их меньше
Nikita
ну я не спорю, когда я начинал с js, я часто бился об копировании ссылок при работе с объектами и массивами
Vladimir
Редактор в той серии дядя Бьярн, и там реально очень хорошо расписаны некоторые оооочень скользкие моменты языка
Vladimir
равно как и Go 🙂
Oleksii
Oleksii
С другого скоупа, так сказать
Oleksii
Nikita
оо в го тоже есть
type Stringer interface {
String() string
}
Vladimir
И в чем проблема? 🙂
Nikita
типо toString(), valueOf() как в js
Vladimir
нене
Vladimir
этом самому надо реализовывать
Nikita
ну да, в js тоже
Vladimir
а, я в js не силен
Nikita
ты можешь сделать объект и объявить в нем пару методов, toString() который вызывается каждый раз когда нужно конвернуть объект в строку и valueOf() когда нужно превратить в number
Nikita
у меня вопрос, я серьезно должен использовать пакет strconv, чтоб конвертировать цифры в строку?
Ivan
fmt.Sprintf("%d", numberValue) ?
Nikita
Сделайте так, чтобы тип IPAddr реализовывал fmt.Stringer, чтобы выводить адрес как четыре значения, разделенные точкой.
Ivan
так ведь %d.%d.%d.%d ?
Oleksii
func (ip IPAddr) String() {
return "bla"
}
Oleksii
но вместо blah - вернуть сегменты ip адреса
Anonymous
имеет смысл использовать syncmap?
Nikita
func (ip *IPAddr) String() string {
return fmt.Sprintf("%d.%d.%d.%d", ip...)
}
Slava
Slava
если нужно писать/читать в map из разных горутин - то да
Anonymous
для большой мапы где много чтения, немного меньше вставки и довольно редко удаление.
с мьютексом из горутин
Anonymous
Kirill
Kirill
Важный
Kirill
Nikita
type IPAddr [4]byte
func (ip *IPAddr) String() string {
return fmt.Sprintf("%d.%d.%d.%d", ip...)
}
Nikita
cannot use ip (type *IPAddr) as type []interface {} in argument to fmt.Sprintf
Michael
(*p)...
Michael
предполагаю
Michael
ip у тебя указателем явл-ся
Nikita
ну так это метод, а методу пофигу что принимать, ссылку или значение
Kirill
Kirill
Она даёт тебе другой результат
Nikita
даже если я делаю значение, ошибка та же
Nikita
values := []interface{ip...}
я и так не могу делать?
aadz
aadz
библиотечка net не кошерная что ли?
Kirill
Kirill
Nikita
func (ip *IPAddr) String() string {
values := make([]interface{}, 0, 4)
for _, val := range ip {
values = append(values, val)
}
return fmt.Sprintf("%d.%d.%d.%d", values...)
}
aadz
fmt.Sprintf("%d.%d.%d.%d"...
В любьом случае не в тему. Если type IPAddr [4]byte, то это массив и нужно просто string.Join() использовать, чтобы это в строку собрать
Nikita
Kirill
aadz
А! Join() же масив строк требует
Kirill
Nikita
а можете объяснить, почему если я делаю, по функцию по String() через указатель, то интерфейс Stringer не срабатывает?
aadz
А чем net-то плоха?
ip := net.IPv4(127, 0, 0, 1)
fmt.Println(ip, ip.String())
И все
Oleksii
aadz
этим и плоха? :)
Oleksii
Человек должен научится использовать язык, а не копаться в стдлиб с первых минут
Kirill
func (ip IPAddr) String() string {
return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}
Oleksii
Oleksii
самый простой способ
aadz
Хоть бы назвали как-то по-другому. Понятно, что стандартная библиотека никому не интересна, но вобще-то IPAddr там - это не массив из четырех байт. Зачем путаться и людей путать?
Nikita
aadz
Nikita
мне бы еще понять почему с указателем не работает, а без работает.
Nikita
я нашел ответ, но не совсем его понимаю
Nikita
https://stackoverflow.com/questions/16976523/in-go-why-isnt-my-stringer-interface-method-getting-invoked-when-using-fmt-pr
Pawel
хотя у неё есть не тривиальные идиомы тоже
Oleksii
Nikita
аа
Nikita
когда 6 раз перечитал, я понял
Oleksii
Есть правило языка:
Методы с value-ресивером могут вызываться как с value, так и с pointer
Методы с pointer-ресивером могут вызываться только с-под pointer
Nikita
типо когда я использую это вручную, то компилятор сам преобразует правильно, а когда через интерфейс, то этого не происходит
Nikita
Oleksii
Oleksii
И вообще, многое, что связано с пустыми интерфейсами надо делать явно