2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{“S1“:[“M1“,“M2“],“S2“:[],“S3“:[“M1“,“M3“]},顺序不限
2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{“S1”:[“M1”,“M2”],“S2”:[],“S3”:[“M1”,“M3”]},顺序不限。S1的M3方法不是指针方法,S3的M2方法也不是指针方法,所以不能输出。
package main
type S1 struct{}
func (this *S1) M1() {}
func (this *S1) M2() {}
func (this S1) M3() {}
type S2 struct{}
type S3 struct{}
func (this *S3) M1() {}
func (this S3) M2() {}
func (this *S3) M3() {}
答案2022-11-14:
这道题有人说用反射,实际上反射是无法解决这个问题的,原因是无法直接使用结构体。
 要解析rust的代码,go/ast、go/parser、go/token,要用到这三个包。
 使用场景是写框架。
代码用go语言编写。代码如下:
package main
import (
	"encoding/json"
	"fmt"
	"go/ast"
	"go/parser"
	"go/token"
)
const content = `package main
type S1 struct{}
func (this *S1) M1() {}
func (this *S1) M2() {}
func (this S1) M3() {}
type S2 struct{}
type S3 struct{}
func (this *S3) M1() {}
func (this S3) M2() {}
func (this *S3) M3() {}`
func main() {
	fset := token.NewFileSet()
	f, err := parser.ParseFile(fset, "", content, parser.ParseComments)
	if err != nil {
		fmt.Println(err)
		return
	}
	structInfoList := make([]*StructInfo, 0)
	structInfoMap := make(map[string]*StructInfo)
	// 找结构体
	for i := 0; i < len(f.Decls); i++ {
		decl, ok := f.Decls[i].(*ast.GenDecl)
		if !ok {
			continue
		}
		if decl.Tok != token.TYPE {
			continue
		}
		if len(decl.Specs) != 1 {
			continue
		}
		spec, ok2 := decl.Specs[0].(*ast.TypeSpec)
		if !ok2 {
			continue
		}
		structType, ok3 := spec.Type.(*ast.StructType)
		if !ok3 {
			fmt.Println("失败", structType)
			continue
		}
		structInfo := NewStructInfo(spec.Name.Name)
		structInfoList = append(structInfoList, structInfo)
		structInfoMap[spec.Name.Name] = structInfo
	}
	// 找方法
	for i := 0; i < len(f.Decls); i++ {
		decl, ok := f.Decls[i].(*ast.FuncDecl)
		if !ok {
			continue
		}
		if decl.Recv == nil || len(decl.Recv.List) != 1 {
			continue
		}
		structName := ""
		switch decl.Recv.List[0].Type.(type) {
		case *ast.StarExpr: //指针方法
			structName = decl.Recv.List[0].Type.(*ast.StarExpr).X.(*ast.Ident).Name
		case *ast.Ident: //普通方法
			//structName = decl.Recv.List[0].Type.(*ast.Ident).Name
		}
		if structInfo, ok := structInfoMap[structName]; ok {
			structInfo.MethodNameList = append(structInfo.MethodNameList, decl.Name.Name)
		}
	}
	// 输出
	data, _ := json.MarshalIndent(structInfoList, "", "  ")
	fmt.Println(string(data))
}
type StructInfo struct {
	StructName     string   `json:"structName,omitempty"`
	MethodNameList []string `json:"methodNameList,omitempty"`
}
func NewStructInfo(structName string) *StructInfo {
	return &StructInfo{StructName: structName, MethodNameList: make([]string, 0)}
}
执行结果如下:

2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{“S1“:[“M1“,“M2“],“S2“:[],“S3“:[“M1“,“M3“]},顺序不限的更多相关文章
- 客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值。
		客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值. 无论是什么的html控件,只要加上了runat="server" ... 
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
		原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ... 
- C语言的结构体和C++结构体的区别
		关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ... 
- C语言的结构体和 C++结构体的区别
		C语言的结构体和 C++结构体的区别 关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不 ... 
- GO学习-(38) Go语言结构体转map[string]interface{}的若干方法
		结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ... 
- VS编程,WPF中,获取鼠标相对于当前屏幕坐标的一种方法
		原文:VS编程,WPF中,获取鼠标相对于当前屏幕坐标的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/det ... 
- java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序
		java静态代码块/静态属性.构造块.构造方法执行.main方法.普通代码块的顺序 这也是在笔试中的一个重要的考点,就有一个输出语句让你写出输出的结果. 理论知识: 静态代码块是:属于类的,在类加载时 ... 
- MFC中的NMHDR结构体和NMUPDOWN结构体
		建立spin控件,创建UDN_DELTAPOS一个消息函数后: void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { NM ... 
- C++结构体与Delphi结构体相互传参,结构体中包含结构体的嵌套,数组指针
		//结构体的声明 typedef struct Mwinddirectbaseline { char* p; int s; int i; }Mwinddirectbaseline; typedef s ... 
- C语言 结构体(嵌套结构体--结构体数组)
		//结构体--嵌套结构体和结构体数组 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> ... 
随机推荐
- win10无管理员权限下以压缩包方式安装JDK8
			使用场景:如果在没有管理员权限的情况下,无法运行.exe文件,可以使用这种方式安装,本次把JDK安装到D:\jdk-8u152 一:获取JDK8的压缩包 1.JDK8 华为镜像地址 2.将下载好的ex ... 
- Qt打包win应用的流程(转载)
			基本就是命令:windeployqt 目标文件.exe 一定要新开一个文件夹再执行这个命令. 参考网站: https://blog.csdn.net/weixin_39504048/article/ ... 
- 基于leaflet地图可视化(一)
			最近,在学习地图可视化是基于公司的项目.但公司在项目上居然用图片来代替.无语~~~项目效果图(第一版)如下: 突发奇想,2016年自己就接触过地图可视化.但那是没有深入研究.只会用R语言来实现点基础. ... 
- redis学习(二)数据类型
			hash类型 • string 类型的键值对集合 • redis 中数据类型不支持嵌套,例如不能在 hash 中设置值为 hash • 适合用于存储对象 • 每个 hash 可以存储 2 32 -1 ... 
- pytest用例管理框架实战(基础篇)
			先安装pip install pytest pytest用例管理框架 默认规则: 1.py文件必须以test_开头或者_test结尾 2.类名必须以test开头 3.测试用例必须以test_开头 ge ... 
- 漫谈Python魔术方法,见过的没见过的都在这里了
			漫谈Python魔术方法,见过的没见过的都在这里了 就说一下,不深入 假的一览 提到魔术方法,学过python都应该知道一些.至少你得会__init__吧. 在我之前写的博文中有很多都涉及魔术方法.比 ... 
- PHP 文件和文件夹操作
			文件夹操作 创建文件夹 mkdir(名称,权限,递归创建):创建文件 例如: #创建文件夹 mkdir('./aa') # 创建 aa 文件夹 mkdir('./aa/bb') # 在 aa 目录下创 ... 
- webgl 系列 —— 绘制猫
			其他章节请看: webgl 系列 绘制猫 上文我们了解了如何绘制渐变彩色三角形,明白了图形装配.光栅化,以及片元着色器计算片元的颜色. 现在如果让你绘制如下一只猫.难道绘制很多三角形,然后指定它们的颜 ... 
- idea创建Spring项目时选择Maven还是Spring initializr?
			今天在使用idea创建Spring项目时不知道选择Maven还是Spring initializr 接着都实验了一下,其实本质是一样的,使用"spring initializr"创 ... 
- SaaS、PaaS、IaaS区别
			SaaS SaaS 越久,觉得它个庞大的领域 SaaS 收入的"长江流域". 传统软件像买房:什么都得自己买,价格昂贵,一般人用不起.SaaS模式就像是租赁预先装修好的共享公寓,拎 ... 
