generic

152 views
Skip to first unread message

Aln Kapa

unread,
Mar 25, 2022, 8:34:24 AM3/25/22
to Golang Russian

Привет все. Подскажите, не понял как тут быть.

type QQ[F any, T any] interface {

  Set(T)

  Get() T

}

type Q struct {

 p string

}

func (q *Q) Set(in string) {

 q.p = in

}

func (q Q) Get() string {

 return q.p

}

func D[F, T QQ[F, T]](v T, t *testing.T) {

  e := *new(F)

  e.Set(v)

  t.Log(e.Get())

}

func TestOne(t *testing.T) {

  D[Q, string](string("test"), t)

}

Ошибка не видит Set, в целом то понятно почему, но если сделать так

func TestOne(t *testing.T) {

 D[*Q, string](string("test"), t)

}

Перестает видеть Get, и это тоже понятно.

Proposal предлагает что-то типа такого

type Set[F any, T any] interface {

  Set(T)

 *F

}

type QQ[F Set[F], T any] interface {

  Get() T

}

х.з. как это работает, нечего толком не получилось.

Подскажите плиз, может я изначально не туда капаю.

Andrey Velikoredchanin

unread,
Mar 25, 2022, 8:47:04 AM3/25/22
to golang-ru
type QQ[F any, T any] interface {
  Set(T)
  Get() T
}

А зачем вот тут объявление F если он не используется?

пт, 25 мар. 2022 г. в 15:34, Aln Kapa <aln...@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/fd51a606-f3f8-4389-af10-4c168f055d03n%40googlegroups.com.

Aln Kapa

unread,
Mar 25, 2022, 9:14:07 AM3/25/22
to gola...@googlegroups.com
func D[F, T QQ[F, T]](v T, t *testing.T) {

  e := *new(F) ------ !!!

}

Грубо есть похожие струтуры и у них есть похожие методы, описывают они данные. Эти данные надо писать к примеру в базу или еще как то обрабатывать. Появилось желание подсократить код в плане обработки, сделать его более общим, а всю уникальность затянуть а структуры данных.


Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/CAOrB69M7t8i0G-UsUwPYHWcGWjND73hwgeHFnDk2Pgybtzxh3Q%40mail.gmail.com.

Aln Kapa

unread,
Mar 25, 2022, 9:29:03 AM3/25/22
to gola...@googlegroups.com
А ну да есть еще и такой кусок.
type QQ[F any, T any] interface {
....
DBParse(sql_ops.Row) (*T, error)
....
}


On Fri, Mar 25, 2022 at 3:47 PM Andrey Velikoredchanin <uncle...@gmail.com> wrote:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/CAOrB69M7t8i0G-UsUwPYHWcGWjND73hwgeHFnDk2Pgybtzxh3Q%40mail.gmail.com.

sp...@mail.ru

unread,
Mar 25, 2022, 10:11:39 AM3/25/22
to Golang Russian
https://go.dev/tour/methods/8
In general, all methods on a given type should have either value or pointer receivers, but not a mixture of both.

Q не является реализацией интерфейса QQ, т.к. method set должен иметь одинаковый receiver (pointer или value, не важно). Get нужно переделать на pointer receiver и тогда заведется.

Aln Kapa

unread,
Mar 25, 2022, 11:14:36 AM3/25/22
to gola...@googlegroups.com
Странно, и давно такое вот появилось "but not a mixture of both". Было вроде так, если метод меняет данные то с указателем, если нет то по значению. Хм. надо почитать.

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/b6a4283a-3a1c-4af2-ad28-4b9641765877n%40googlegroups.com.

sp...@mail.ru

unread,
Mar 26, 2022, 10:50:33 AM3/26/22
to Golang Russian
In general, т.е. это не правило, а рекомендация. Наборы методов для pointer и value receiver - отдельные. Т.е. У твоего Q есть набор методов c value receiver (Get) и отдельный набор методов с pointer receiver (Set). Ни один из них не удовлетворяет требованиям интерфейса.
Про изменение/чтение все верно, и пока нет интерфейсов - все отлично работает. Но в любой реальной программе интерфейсы будут. Потому в 99% случаев приходится все сажать pointer receiver - за исключением каких-нибудт хитрых иммутабельных штук.

sp...@mail.ru

unread,
Mar 26, 2022, 10:52:27 AM3/26/22
to Golang Russian

sp...@mail.ru

unread,
Mar 26, 2022, 10:56:16 AM3/26/22
to Golang Russian
Хотя похоже я сам что-то важное здесь упускаю. Согласно спеке *T method set включает в себя методы с value receiver. Т.е. твой пример должен работать если адресовать *Q

sp...@mail.ru

unread,
Mar 26, 2022, 10:56:49 AM3/26/22
to Golang Russian
Можешь подбить пример в playground? Было бы понятнее и легче проверять.

Aln Kapa

unread,
Mar 26, 2022, 1:42:47 PM3/26/22
to gola...@googlegroups.com
Да нет не очень хитрых, сейчас всего не вспомню ну вот к примеру структура с мутексом, если по мимо защищаймого поля есть ещё, и его надо почитать.  С интересом не понимаю. По сути он носит описательный характер, влиять на то что делает тот или иной метод и как передается структура в метод не может.

сб, 26 мар. 2022 г., 17:50 'sp...@mail.ru' via Golang Russian <gola...@googlegroups.com>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/19386174-8bae-48ac-a763-0e061a4b6718n%40googlegroups.com.

Aln Kapa

unread,
Mar 26, 2022, 1:50:41 PM3/26/22
to gola...@googlegroups.com
Мое мнение такое, в обычном виде происходит неявное разименование указателя поэтому не разнице между структурой и ее указателем. Где-то я такое читал, уже не помню. А в шаблоне такого не происходит почему я х.з. Возможно не до пилили ещё. Что там писали что сделали не все.

сб, 26 мар. 2022 г., 17:56 'sp...@mail.ru' via Golang Russian <gola...@googlegroups.com>:
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Golang Russian".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/golang-ru/XScLS7ytOpA/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/1f018aaa-b568-40b7-b29d-1ea4f3adda9cn%40googlegroups.com.

Aln Kapa

unread,
Mar 28, 2022, 1:47:45 PM3/28/22
to gola...@googlegroups.com
Вот такое получилось, даже работает.

// тут описываем
type constr[T, T1 any] interface {
Set(T1)
Get() T1
*T // --- вот это осталось не ясным, кто знает подскажите
Parse() *T
}

// тут реализуем
type Q struct {
p string
}

func (q *Q) Set(in string) {
q.p = in
}

func (q Q) Get() string {
return q.p
}

func (q Q) Parse() *Q {
return &Q{}
}

// тут делаем объекты
func f2[T any, P constr[T, V], V any](v V, t *testing.T) P {
d := *new(T)
p := P(&d)
p.Set(v)
return p
}

func Test2(t *testing.T) {
m := f2[Q, *Q, string]("test1", t)
t.Log(m.Get())
}

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/fd51a606-f3f8-4389-af10-4c168f055d03n%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages