泛型什么时候能用, 1.19支持字段吗?

aaaaaaaa1 · 2022-05-27 10:36:25 · 2785 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-05-27 10:36:25 的主题,其中的信息可能已经有所发展或是发生改变。

读取字段不支持, 方法参数不能有泛型, 那要这泛型有何用.

1.18的泛型是来搞笑的吗, 没整理好就发布了, 唉!

// 心力交瘁, 等c++的import, golang 泛型. 关键是一个都没实现, 逼着我用C# JAVA......


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2785 次点击  ∙  1 赞  
加入收藏 微博
12 回复  |  直到 2022-05-29 08:40:18
pithing
pithing · #1 · 3年之前

说实话有没有泛型也不影响写代码吧?

don178
don178 · #2 · 3年之前

读取字段不支持是什么,方法参数可以有泛型。

wln123
wln123 · #3 · 3年之前
don178don178 #2 回复

读取字段不支持是什么,方法参数可以有泛型。

不行的,方法不能有泛型

wln123
wln123 · #4 · 3年之前

好像说是后面会支持,现在不支持,泛型就不是go语言的第一目标,编译速度才是

aaaaaaaa1
aaaaaaaa1 · #5 · 3年之前
pithingpithing #1 回复

说实话有没有泛型也不影响写代码吧?

影响很大, 对于cgo和使用堆外使用堆外内存的项目;

aaaaaaaa1
aaaaaaaa1 · #6 · 3年之前
don178don178 #2 回复

读取字段不支持是什么,方法参数可以有泛型。

泛型中都拥有的字段, 不支持直接访问, 需要转换为具体的泛型实例才能访问.

don178
don178 · #7 · 3年之前

5楼 @aaaaaaaa1

// 二叉查找树实现

type Node[k, v int | string] struct {
    Key   k
    Value v
    Left  *Node[k, v]
    Right *Node[k, v]
}

type Tree[k, v int | string] struct {
    Root *Node[k, v]
    N    int
}

func NewTree[k, v int | string]() *Tree[k, v] {
    return new(Tree[k, v])
}

func (t *Tree[k, v]) Put(key k, value v) {
    t.Root = t.PutOnNode(t.Root, key, value)
}

你看看代码,还是说我理解错了。

don178
don178 · #8 · 3年之前
wln123wln123 #4 回复

好像说是后面会支持,现在不支持,泛型就不是go语言的第一目标,编译速度才是

上面部分代码,还是说是我理解错了。

aaaaaaaa1
aaaaaaaa1 · #9 · 3年之前
type Generic [T int|float32] struct {
    id int
    data T
}

func check[T Generic[int]|Generic[float32]](a T, b T){
    if a.id == b.id  {   // 错误
        println("just use filed")
    }

}

func main() {
    var a =Generic[int]{}
    var b =Generic[int]{}
    var c =Generic[float32]{}
    check(a,b)
    check(a,c)
}

这么简单的模版都实现不了; 除非check函数不用泛型, 直接给泛型实例做参数,

don178
don178 · #10 · 3年之前
aaaaaaaa1aaaaaaaa1 #9 回复

``` type Generic [T int|float32] struct { id int data T } func check[T Generic[int]|Generic[float32]](a T, b T){ if a.id == b.id { // 错误 println("just use filed") } } func main() { var a =Generic[int]{} var b =Generic[int]{} var c =Generic[float32]{} check(a,b) check(a,c) } ``` 这么简单的模版都实现不了; 除非check函数不用泛型, 直接给泛型实例做参数,

你这代码我想了很久,还是没明白你想做什么0.0。 a和b是一个类型还是可以是不同类型。

type Generic[T int | float32] struct {
    id   int
    data T
}

func check[T int | float32](a, b Generic[T]) {
    if a.id == b.id { // 错误
        println("just use filed")
    }
}

func check1[T, T2 int | float32](a Generic[T], b Generic[T2]) {
    if a.id == b.id { // 错误
        println("just use filed")
    }
}

func main() {
    var a = Generic[int]{}
    var b = Generic[int]{}
    var c = Generic[float32]{}
    check(a, b)
    check1(a, c)
}

希望对你有帮助。

aaaaaaaa1
aaaaaaaa1 · #11 · 3年之前
don178don178 #10 回复

#9楼 @aaaaaaaa1 你这代码我想了很久,还是没明白你想做什么0.0。 a和b是一个类型还是可以是不同类型。 ```golang type Generic[T int | float32] struct { id int data T } func check[T int | float32](a, b Generic[T]) { if a.id == b.id { // 错误 println("just use filed") } } func check1[T, T2 int | float32](a Generic[T], b Generic[T2]) { if a.id == b.id { // 错误 println("just use filed") } } func main() { var a = Generic[int]{} var b = Generic[int]{} var c = Generic[float32]{} check(a, b) check1(a, c) } ``` 希望对你有帮助。

thanks, 没想到可以这么曲线实现; 游戏服务器项目, 比如物理检测, 不同形状之间只差字段的类型. 以前用go:generate 勉强实现, 代码混乱不堪. 为降低GC不能用interface, 用堆外内存, 以前的代码都没法看了.

wln123
wln123 · #12 · 3年之前
aaaaaaaa1aaaaaaaa1 #11 回复

#10楼 @don178 thanks, 没想到可以这么曲线实现; 游戏服务器项目, 比如物理检测, 不同形状之间只差字段的类型. 以前用go:generate 勉强实现, 代码混乱不堪. 为降低GC不能用interface, 用堆外内存, 以前的代码都没法看了.

go目前的泛型是残缺的,只能用来存不同的数据而已,其他复杂的需求没法实现

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传