go语言 从结构体中获取某个字段的值(反射+泛型)

Go 语言提供了 user.Name 语法,来从 user 结构体中获取 Name 的值。 那么如果我们想将 Name 变成变量该如何做呢?

原型:getStructField(input interface{}, key string) (value interface{}, err error)

功能:从 input 结构体中,取出 key 字段 对应的值

代码实现:

package utils

import (
    "errors"
    "fmt"
    "reflect"
)

func GetStructStringField(input interface{}, key string) (value string, err error) {
    v, err := getStructField(input, key)
    if err != nil {
        return
    }
    value, ok := v.(string)
    if !ok {
        return value, errors.New("can‘t convert key‘v to string")
    }
    return
}

func GetStructFloat64Field(input interface{}, key string) (value float64, err error) {
    v, err := getStructField(input, key)
    if err != nil {
        return
    }
    value, ok := v.(float64)
    if !ok {
        return value, errors.New("can‘t convert key‘v to float64")
    }
    return
}

func getStructField(input interface{}, key string) (value interface{}, err error) {
    rv := reflect.ValueOf(input)
    rt := reflect.TypeOf(input)
    if rt.Kind() != reflect.Struct {
        return value, errors.New("input must be struct")
    }

    keyExist := false
    for i := 0; i < rt.NumField(); i++ {
        curField := rv.Field(i)
        if rt.Field(i).Name == key {
            switch curField.Kind() {
            case reflect.String, reflect.Int64, reflect.Int32, reflect.Int16, reflect.Int8, reflect.Int, reflect.Float64, reflect.Float32:
                keyExist = true
                value = curField.Interface()
            default:
                return value, errors.New("key must be int float or string")
            }
        }
    }
    if !keyExist {
        return value, errors.New(fmt.Sprintf("key %s not found in %s‘s field", key, rt))
    }
    return
}

  

测试:

func TestGetStructFiled(t *testing.T) {
	user1 := User{
		ID:   1,
		NAME: "aaa",
	}
	v, err := GetStructStringField(user1, "NAME")
	fmt.Println(v, err)
}

测试结果

aaa <nil>

  

原文地址:https://www.cnblogs.com/zhongweikang/p/12613309.html

时间: 2025-01-12 15:17:55

go语言 从结构体中获取某个字段的值(反射+泛型)的相关文章

【C语言】结构体中的内存对齐问题

话说大家有没有发现结构体中的内存对齐问题很有意思呢?我们这一次就一起研究一下这个问题为什么值得人探讨. 结构体内存对齐有三个原则; 1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). 2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有s

[SoapUI]怎样从应答报文中获取某个字段的值,然后用其改写某个变量

import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def holder = groovyUtils.getXmlHolder( "NormalUserLoginHealthTest#Response" ) def ProductID = holder.getNodeValue("//authen[1]/impsn[1]/pid[1]/text()

在C语言结构体中添加成员函数

我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结构体中添加成员变量呢 在C语言的结构体中是不能直接定义成员函数的,这点和C++不同,但是我们可以通过定义一个函数指针的方式来指向一个方法. 示例代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct node 4

ios开发中的C语言学习—— 结构体简介

在开发过程中,经常会需要处理一组不同类型的数据,比如学生的个人信息,由姓名.年龄.性别.身高等组成,因为这些数据是由不同数据类型组成的,因此不能用数组表示,对于不同数据类型的一组数据,可以采用结构体来进行存储.当然,对于面向对象的语言来说,最好是用类来表示,但是C语言是面向过程的,因此选择用结构体来表示. 一.结构体的定义 struct 结构体名{ 类型名 成员名1; 类型名 成员名2; ... ... 类型名 成员名n; }; 二.结构体的变量声明 1.先定义结构体类型,再定义变量 代码 //

C语言 结构体中的成员域偏移量

//C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct _student{ char name[30];//32 int num; }Student; void main(){ Student *p = NULL; printf("%x\n", p);//打印 0 p

c语言结构体中动态数组的使用

[背景] c语言结构体中动态数组使得用户能够根据需要来申请空间,相比静态数组,更能有效利用存储空间. [正文] 1. 动态数组在结构体中间 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int a; char buf[0]; // 或者char buf[]; int b; }Node; int main() { printf("%d\n", si

C语言结构体中的函数指针

这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in-c-struct.html,转载请注明源地址. 引言 指针是C语言的重要组成部分, 于是深入理解指针并且高效地使用指针可以使程序员写出更加老练的程序.我们要记住指针是一个指向内存地址的变量.指针可以引用如int.char……常见的数据类型,例如: int * intptr; // 声明一个指向整型值的

逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合 2.在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类. 3. 结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据结构.结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问. 高级代

【Go语言】【13】再谈GO语言的结构体

本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初始化后的结构体赋值给其它变量,例如: /*声明结构体*/ type employee struct{ name,address string height,weight float64 } /*初始化结构体,并赋给变量emp*/ emp := employee{name:"eagle",