返回顶部
首页 > 资讯 > 后端开发 > GO >有没有好的方法让数字类型适合golang中的“method.Call”?
  • 226
分享到

有没有好的方法让数字类型适合golang中的“method.Call”?

2024-02-09 05:02:57 226人浏览 八月长安
摘要

PHP小编柚子在golang中,使用method.Call方法调用函数时,对于数字类型参数可能会遇到一些问题。但是,我们可以采用一些方法来解决这个问题。首先,我们可以将数字类型转换为对

PHP小编柚子在golang中,使用method.Call方法调用函数时,对于数字类型参数可能会遇到一些问题。但是,我们可以采用一些方法来解决这个问题。首先,我们可以将数字类型转换为对应的reflect.Value类型,然后再传递给method.Call方法。另外,我们还可以使用反射方法来获取函数的参数类型,并根据参数类型进行相应的处理。总之,通过这些方法,我们可以使数字类型适合Golang中的method.Call方法的调用,从而解决这个问题。

问题内容

代码围棋游乐场:

package main

import (
    "fmt"
    "reflect"
)

func (s StructWithManyMethods) Func1(a int, b uint, c float64) {
    fmt.Printf("func:Func1 a:%d b:%d c:%f \n", a, b, c)
}
func (s StructWithManyMethods) Func2(a string, b int, c int, d int) {
    fmt.Printf("func:Func2 a:%s b:%d c:%d d:%d\n", a, b, c, d)
}

type StructWithManyMethods struct {
}

func (s StructWithManyMethods) CallMethod(n string, p []interface{}) {
    method := reflect.ValueOf(s).MethodByName(n)
    methodType := method.Type()
    for i := 0; i < methodType.NumIn(); i++ {
        in := methodType.In(i)
        switch in.Kind() {
        case reflect.Float32:
            switch v := p[i].(type) {
            case float64:
                p[i] = float32(v)
            case float32:
                p[i] = float32(v)
            case int:
                p[i] = float32(v)
            case uint:
                p[i] = float32(v)
            case int8:
                p[i] = float32(v)
            case uint8:
                p[i] = float32(v)
            case int16:
                p[i] = float32(v)
            case uint16:
                p[i] = float32(v)
            case int32:
                p[i] = float32(v)
            case uint32:
                p[i] = float32(v)
            case int64:
                p[i] = float32(v)
            case uint64:
                p[i] = float32(v)
            }
        case reflect.Float64:
            switch v := p[i].(type) {
            case float64:
                p[i] = float64(v)
            case float32:
                p[i] = float64(v)
            case int:
                p[i] = float64(v)
            case uint:
                p[i] = float64(v)
            case int8:
                p[i] = float64(v)
            case uint8:
                p[i] = float64(v)
            case int16:
                p[i] = float64(v)
            case uint16:
                p[i] = float64(v)
            case int32:
                p[i] = float64(v)
            case uint32:
                p[i] = float64(v)
            case int64:
                p[i] = float64(v)
            case uint64:
                p[i] = float64(v)
            }
        case reflect.Int:
            switch v := p[i].(type) {
            case float64:
                p[i] = int(v)
            case float32:
                p[i] = int(v)
            case int:
                p[i] = int(v)
            case uint:
                p[i] = int(v)
            case int8:
                p[i] = int(v)
            case uint8:
                p[i] = int(v)
            case int16:
                p[i] = int(v)
            case uint16:
                p[i] = int(v)
            case int32:
                p[i] = int(v)
            case uint32:
                p[i] = int(v)
            case int64:
                p[i] = int(v)
            case uint64:
                p[i] = int(v)
            }
        case reflect.Uint:
            switch v := p[i].(type) {
            case float64:
                p[i] = uint(v)
            case float32:
                p[i] = uint(v)
            case int:
                p[i] = uint(v)
            case uint:
                p[i] = uint(v)
            case int8:
                p[i] = uint(v)
            case uint8:
                p[i] = uint(v)
            case int16:
                p[i] = uint(v)
            case uint16:
                p[i] = uint(v)
            case int32:
                p[i] = uint(v)
            case uint32:
                p[i] = uint(v)
            case int64:
                p[i] = uint(v)
            case uint64:
                p[i] = uint(v)
            }
        case reflect.Int8:
            switch v := p[i].(type) {
            case float64:
                p[i] = int8(v)
            case float32:
                p[i] = int8(v)
            case int:
                p[i] = int8(v)
            case uint:
                p[i] = int8(v)
            case int8:
                p[i] = int8(v)
            case uint8:
                p[i] = int8(v)
            case int16:
                p[i] = int8(v)
            case uint16:
                p[i] = int8(v)
            case int32:
                p[i] = int8(v)
            case uint32:
                p[i] = int8(v)
            case int64:
                p[i] = int8(v)
            case uint64:
                p[i] = int8(v)
            }
        case reflect.Uint8:
            switch v := p[i].(type) {
            case float64:
                p[i] = uint8(v)
            case float32:
                p[i] = uint8(v)
            case int:
                p[i] = uint8(v)
            case uint:
                p[i] = uint8(v)
            case int8:
                p[i] = uint8(v)
            case uint8:
                p[i] = uint8(v)
            case int16:
                p[i] = uint8(v)
            case uint16:
                p[i] = uint8(v)
            case int32:
                p[i] = uint8(v)
            case uint32:
                p[i] = uint8(v)
            case int64:
                p[i] = uint8(v)
            case uint64:
                p[i] = uint8(v)
            }
        case reflect.Int16:
            switch v := p[i].(type) {
            case float64:
                p[i] = int16(v)
            case float32:
                p[i] = int16(v)
            case int:
                p[i] = int16(v)
            case uint:
                p[i] = int16(v)
            case int8:
                p[i] = int16(v)
            case uint8:
                p[i] = int16(v)
            case int16:
                p[i] = int16(v)
            case uint16:
                p[i] = int16(v)
            case int32:
                p[i] = int16(v)
            case uint32:
                p[i] = int16(v)
            case int64:
                p[i] = int16(v)
            case uint64:
                p[i] = int16(v)
            }
        case reflect.Uint16:
            switch v := p[i].(type) {
            case float64:
                p[i] = uint16(v)
            case float32:
                p[i] = uint16(v)
            case int:
                p[i] = uint16(v)
            case uint:
                p[i] = uint16(v)
            case int8:
                p[i] = uint16(v)
            case uint8:
                p[i] = uint16(v)
            case int16:
                p[i] = uint16(v)
            case uint16:
                p[i] = uint16(v)
            case int32:
                p[i] = uint16(v)
            case uint32:
                p[i] = uint16(v)
            case int64:
                p[i] = uint16(v)
            case uint64:
                p[i] = uint16(v)
            }
        case reflect.Int32:
            switch v := p[i].(type) {
            case float64:
                p[i] = int32(v)
            case float32:
                p[i] = int32(v)
            case int:
                p[i] = int32(v)
            case uint:
                p[i] = int32(v)
            case int8:
                p[i] = int32(v)
            case uint8:
                p[i] = int32(v)
            case int16:
                p[i] = int32(v)
            case uint16:
                p[i] = int32(v)
            case int32:
                p[i] = int32(v)
            case uint32:
                p[i] = int32(v)
            case int64:
                p[i] = int32(v)
            case uint64:
                p[i] = int32(v)
            }
        case reflect.Uint32:
            switch v := p[i].(type) {
            case float64:
                p[i] = uint32(v)
            case float32:
                p[i] = uint32(v)
            case int:
                p[i] = uint32(v)
            case uint:
                p[i] = uint32(v)
            case int8:
                p[i] = uint32(v)
            case uint8:
                p[i] = uint32(v)
            case int16:
                p[i] = uint32(v)
            case uint16:
                p[i] = uint32(v)
            case int32:
                p[i] = uint32(v)
            case uint32:
                p[i] = uint32(v)
            case int64:
                p[i] = uint32(v)
            case uint64:
                p[i] = uint32(v)
            }
        case reflect.Int64:
            switch v := p[i].(type) {
            case float64:
                p[i] = int64(v)
            case float32:
                p[i] = int64(v)
            case int:
                p[i] = int64(v)
            case uint:
                p[i] = int64(v)
            case int8:
                p[i] = int64(v)
            case uint8:
                p[i] = int64(v)
            case int16:
                p[i] = int64(v)
            case uint16:
                p[i] = int64(v)
            case int32:
                p[i] = int64(v)
            case uint32:
                p[i] = int64(v)
            case int64:
                p[i] = int64(v)
            case uint64:
                p[i] = int64(v)
            }
        case reflect.Uint64:
            switch v := p[i].(type) {
            case float64:
                p[i] = uint64(v)
            case float32:
                p[i] = uint64(v)
            case int:
                p[i] = uint64(v)
            case uint:
                p[i] = uint64(v)
            case int8:
                p[i] = uint64(v)
            case uint8:
                p[i] = uint64(v)
            case int16:
                p[i] = uint64(v)
            case uint16:
                p[i] = uint64(v)
            case int32:
                p[i] = uint64(v)
            case uint32:
                p[i] = uint64(v)
            case int64:
                p[i] = uint64(v)
            case uint64:
                p[i] = uint64(v)
            }
        }
    }
    parameterValues := make([]reflect.Value, 0)
    for _, e := range p {
        parameterValues = append(parameterValues, reflect.ValueOf(e))
    }
    method.Call(parameterValues)
}

func main() {
    var s StructWithManyMethods
    s.CallMethod("Func1", []interface{}{1.0, 2.0, 3})
    s.CallMethod("Func2", []interface{}{"test", 1, 2, 3.0})
}

输出:

func:Func1 a:1 b:2 c:3.000000 
func:Func2 a:test b:1 c:2 d:3

因为我需要动态调用方法,但是参数来自不同的数据格式,这就导致需要转换数值类型。例如,在Golang中解析JSON时,不确定的数字类型被视为float64,尽管它可能应该是int。

代码看起来很糟糕,但运行良好。

我想知道是否有更好的方法来做到这一点。

解决方法

使用reflect api 转换值。

func (s StructWithManyMethods) CallMethod(n string, p []interface{}) error {
    method := reflect.ValueOf(s).MethodByName(n)
    methodType := method.Type()
    parameterValues := make([]reflect.Value, methodType.NumIn())
    if len(p) < len(parameterValues) {
        return fmt.Errorf("expected %d parameters, got %d", len(parameterValues), len(p))
    }
    for i := range parameterValues {
        in := methodType.In(i)
        v := reflect.ValueOf(p[i])
        if !v.CanConvert(in) {
            return fmt.Errorf("cannot convert p[%d] from %s to %s", i, v.Type(), in)
        }
        parameterValues[i] = reflect.ValueOf(p[i]).Convert(in)
    }
    method.Call(parameterValues)
    return nil
}

为了防止出现恐慌,此代码在转换之前检查是否允许转换。

在 PlayGround 上运行代码!

以上就是有没有好的方法让数字类型适合golang中的“method.Call”?的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 有没有好的方法让数字类型适合golang中的“method.Call”?

本文链接: https://lsjlt.com/news/562201.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 有没有好的方法让数字类型适合golang中的“method.Call”?
    php小编柚子在golang中,使用method.Call方法调用函数时,对于数字类型参数可能会遇到一些问题。但是,我们可以采用一些方法来解决这个问题。首先,我们可以将数字类型转换为对...
    99+
    2024-02-09
  • golang 类型 dao.Record 没有字段或方法 Id
    大家好,今天本人给大家带来文章《golang 类型 dao.Record 没有字段或方法 Id》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮...
    99+
    2024-04-04
  • Python中的数据类型有哪些,如何选择合适的类型?
    Python作为一种高级编程语言,具有丰富的数据类型,这些数据类型的使用直接影响程序的效率和可读性。本文将介绍Python中常见的数据类型以及如何选择合适的类型。 Python中的数据类型包括:数字、字符串、列表、元组、集合和字典。下面我们...
    99+
    2023-08-19
    数据类型 spring windows
  • 解决springboot的findOne方法没有合适的参数使用问题
    目录springboot的findOne方法没有合适的参数使用找了半天没找到是什么原因这里改为1.5.10之后SpringBoot踩过的坑之findOne()简而言之经过多次百度,我...
    99+
    2024-04-02
  • golang类型转换的方法有哪些
    在Golang中,类型转换的方法有以下几种: 默认类型转换:可以通过将一个类型直接赋值给另一个类型来进行类型转换。例如:var ...
    99+
    2023-10-22
    golang
  • mysql数据库类型有哪些?如何选择合适的数据类型
    选择 mysql 数据类型时需考虑以下因素:数据范围、约束、存储空间、查询性能。mysql 数据类型分为:数值类型:tinyint、int 等日期和时间类型:date、datetime ...
    99+
    2024-04-14
    mysql
  • Laravel中的数据类型到底有多少种?如何选择最适合的类型?
    Laravel是一款流行的PHP框架,其内置了许多数据类型,包括字符串、整数、浮点数、数组、对象等。在使用Laravel时,选择合适的数据类型对于代码的性能和安全性有着重要的影响。本文将介绍Laravel中的数据类型以及如何选择最适合的类型...
    99+
    2023-10-02
    laravel load 数据类型
  • golang中常见的类型转换方法有哪些
    本篇内容介绍了“golang中常见的类型转换方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!数字类型转换在Golang中,数字类型转...
    99+
    2023-07-05
  • c语言中提供的合法数据类型关键字有哪些
    c语言中提供的合法数据类型关键字有:char:声明字符型变量或函数。double:声明双精度变量或函数。enum:声明枚举类型。float:声明浮点型变量或函数。int:声明整型变量或函数。long:声明长整型变量或函数。short:声明短...
    99+
    2024-04-02
  • Golang中map数据类型的使用方法
    目录前言案例mapmap定义map声明map的操作总结前言 今天咱们来学习一下golang中的map数据类型,单纯的总结一下基本语法和使用场景,也不具体深入底层。map类型是什么呢?...
    99+
    2024-04-02
  • php中字符串转为数字类型的方式有哪些
    这篇文章主要讲解了“php中字符串转为数字类型的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中字符串转为数字类型的方式有哪些”吧!以下是PHP中字符串转为数字类型的几种方式...
    99+
    2023-07-05
  • Golang中的泛型函数是否支持所有类型?
    否,go 中泛型函数仅支持用户定义类型、指针类型、切片类型、映射类型和通道类型。 Golang 中泛型函数是否支持所有类型? 概述 泛型函数允许我们创建适用于各种类型的数据的函数。在 ...
    99+
    2024-04-17
    类型检查 泛型函数 golang
  • JS数据类型的方法有哪些
    本篇内容介绍了“JS数据类型的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在 ECMAScript 规范中,共定义了 7 种数据...
    99+
    2023-06-27
  • Python中使用numpy处理LeetCode数组问题,有没有更好的方法?
    在LeetCode中,数组是一种常见的数据结构,许多算法题目都会涉及到数组的操作。在Python中,numpy库是处理数组的常用工具之一。在这篇文章中,我们将介绍如何使用numpy库来解决LeetCode中的数组问题,并探讨是否有更好的方...
    99+
    2023-06-30
    numpy leetcode 数组
  • javascript中有哪些参数类型转换的方法
    javascript中有哪些参数类型转换的方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供...
    99+
    2023-06-14
  • JavaScript中数据类型的使用方法有哪些?
    JavaScript作为一门动态类型语言,它的数据类型使用方法非常灵活。在JavaScript中,数据类型主要分为基本数据类型和引用数据类型两大类。本文将会详细介绍JavaScript中各个数据类型的使用方法。 一、基本数据类型 Java...
    99+
    2023-11-02
    异步编程 javascript 数据类型
  • Golang中常用的基本数据类型有哪些
    这篇文章主要讲解了“Golang中常用的基本数据类型有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中常用的基本数据类型有哪些”吧!Golang 是一种强类型语言,变量使用时...
    99+
    2023-07-02
  • Python数据类型在常见集合中的语法有哪些
    这篇文章将为大家详细讲解有关Python数据类型在常见集合中的语法有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python数据类型中的set和C#中的集合(collection)不是...
    99+
    2023-06-17
  • TensorFlow中的模型融合方法有哪些
    在TensorFlow中,模型融合的方法主要包括以下几种: 投票(Voting):将多个模型的预测结果进行投票,选择得票最多的结...
    99+
    2024-03-01
    TensorFlow
  • MySQL中最适合用于性别字段的数据类型是什么?
    在MySQL中,最适合用于性别字段的数据类型是ENUM枚举类型。ENUM枚举类型是一种允许定义一组可能取值的数据类型,性别字段适合使用ENUM类型是因为性别通常仅有两个取值,即男和女。...
    99+
    2024-03-15
    mysql 数据类型 性别字段
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作