Wener Notes

泛型

约 2 分钟阅读

Golang 泛型

FAQ

new(T)

目前该方法无法使用 stackoverflow.com/questions/71440697

  • 直接限定不方便传参数,因为 struct 不一定实现 interface, *struct 才实现 interface
正确做法
type Setter[T any] interface {
	SetIndex(n int)
	*T
}
func setIndex[T any, PT Setter[T]](items []int) (o []PT) {
	for _, v := range items {
		m := PT(new(T))
		m.SetIndex(v)
		o = append(o, m)
	}
	return
}

// 限定 接口 直接写也可以
func setIndex[T any, PT interface {
  SetIndex(n int)
  *T
}](items []int) (o []PT) {
	for _, v := range items {
		m := PT(new(T))
		m.SetIndex(v)
		o = append(o, m)
	}
	return
}
错误做法
func setIndex[M interface {
	SetIndex(n int)
}](items []int) (o []M) {
	for _, v := range items {
    // NPE
		m := *new(M)
		m.SetIndex(v)
		o = append(o, m)
	}
	return
}

type A struct {
	Index int
}

func (s *A) SetIndex(v int) {
	s.Index = v
}
func TestSetIndex(t *testing.T) {
  // 会出现 NPE
	fmt.Println(setIndex[*A]([]int{1, 2, 3, 4}))
}

method must have no type parameters

go
type A struct{}
// method 不支持 类型参数
func (v A)Map[T any](f func(A)T)T{
  return f(v)
}

// func 支持 类型参数
func Map[IN any, OUT any](s IN, f func(IN) OUT) (o OUT) {
	return f(s)
}

cannot use generic type without instantiation

go
type A[T any] struct {}
// 不可以
func(a A)Name(){}
// 可以
func(a A[T])Name(){}

cannot use type assertion on type parameter value Xxx(variable of type T constrained by any)

go
type A[T any] struct {
  Val T
}
func(a A[T])Name(){
  // 不可以 - 因为 T 是具体类型
  _,_=a.Val.(string)

  // 可以
  var v interface{} = a.Val
	_, _ = v.(string)

  // 可以
  _, _ = (interface{})(a.Val).(string)
}

关联信息

反向链接、本文链接的其他页面和外部资料。

反向链接

  • Go Version
    笔记 · generic

    Go-Release-Cycle · 一年两个版本 - 2 月,8 月 · bugfix backports 一个版本 · security backports 两个版本 · 参考 · golang/proposal · golang/go/projects/1

References

GitHub4 条
其他外链3 条
最近更新commit 365c961Edit

On this page