登录
首页 >  Golang >  Go问答

避免出现 IncompleteAssign 错误,将值分配给泛型类型的结构字段

来源:stackoverflow

时间:2024-02-09 16:48:23 375浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《避免出现 IncompleteAssign 错误,将值分配给泛型类型的结构字段》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

这很好:

type constraint interface {
    ~float32 | ~float64
}

type foo[t constraint] struct {
    val t
}

func (f *foo[float64]) setvaltopi() {
    f.val = 3.14
}

但是,如果我将 constraint 更改为还包含 int 类型,则会遇到错误:

type constraint interface {
    ~float32 | ~float64 | ~int
}

type foo[T constraint] struct {
    val T
}

func (f *foo[float64]) setValToPi() {
    f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment
}

为什么包含不属于同一“类型组”的类型的约束会导致此错误,我应该如何处理它?

正确答案


此语法:

func (f *foo[float64]) setvaltopi() {
    // ...
}

只是一个方法声明。它不实例化泛型类型 foo。方括号内的标识符 float64 是类型参数的名称。它也可以是 t,就像类型定义中那样。

就像你写的:

type foo[float64 constraint] struct {
    val float64
}

由于 float64 是预声明的标识符,因此您可以使用类型参数名称来隐藏它。

因此,在方法 setvaltopi 中,有关 val 类型的唯一已知信息是它被约束为 constraint,例如~float32 的并集 | 〜float64 | ~int

如果将方法声明更改为:

func (f *foo[t]) setvaltopi() {
    // ...
}

使用 t 会出现相同的错误:

不能使用 3.14(无类型浮点常量)作为赋值中的 t 值

这个错误是由于 3.14 (一种无类型浮点常量)不能总是分配给 foo[t]所有可能实例这一事实而产生的,特别是其中 t 确实是 ~int

演示,其中 float64 标识符作为类型参数:https://gotipplay.golang.org/p/1EuAsSKdihK

解决方案是让该方法接受类型参数类型的值(除了使用不太容易混淆的标识符之外):

func (f *foo[T]) SetValue(val T) {
    f.val = val
}

这当然意味着您不能设置像 3.14 这样的固定值,但正如所解释的,这首先是一个错误。其他可能的解决方案是使用 any/interface{} 作为字段类型。如需一些灵感,请参阅 herehere

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>