登录
首页 >  Golang >  Go问答

Go语言中的泛型类型的返回

来源:stackoverflow

时间:2024-03-13 11:54:27 362浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Go语言中的泛型类型的返回》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

以下内容无法在线编译 res = fmt.sprintf("%s + %s", i, j),并出现错误: cannot use fmt.sprintf("%s + %s", i, j ) (字符串类型的值)作为赋值中的类型 t

确实允许我返回一个int,并且如果我简单地return i + j,代码确实编译并运行。

我缺少一些基本的理解,需要指出正确的方向。

import (
    "fmt"
    "reflect"
)

type Adder interface {
    string | int
}

func Add[T Adder](i, j T) T {
    var res T

    switch reflect.TypeOf(i).Name() {
    case "int":
        res = i + j
    case "string":
        res = fmt.Sprintf("%s + %s", i, j)
    }

    return res
}
func main() {
    it := Add(3, 4)
    st := Add("one", "two")

    fmt.Println("Int:", it)
    fmt.Println("Str:", st)
}

正确答案


看看 add 对字符串做了什么:

func add[string](i, j string) string {
    var res string

    switch reflect.typeof(i).name() {
    case "int":
        res = i + j
    case "string":
        res = fmt.sprintf("%s + %s", i, j)
    }

    return res
}

这没关系。表达式 i + j 只是连接两个字符串。看看addint做了什么:

func Add[int](i, j int) int {
    var res int

    switch reflect.TypeOf(i).Name() {
    case "int":
        res = i + j
    case "string":
        res = fmt.Sprintf("%s + %s", i, j)
    }

    return res
}

这是一个类型错误。 "string" 分支在运行时从未被采用并不重要——整个函数必须进行类型检查!

(请注意,go 实际上并没有通过插入类型来实例化泛型,但您明白了。)

以上就是《Go语言中的泛型类型的返回》的详细内容,更多关于的资料请关注golang学习网公众号!

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