go: Recursion Algorithm

发布时间:2026/7/17 0:50:58

go: Recursion Algorithm
/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Recursion Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/16 22:41 # User : geovindu # Product : GoLand # Project : goalgorithms # File : recursion.go */ package recursion import ( fmt sort ) // 1. 权限常量定义 var PERMISSION map[string]string{ // 门店基础 sale_view: 销售单据查看, sale_create: 开单销售, stock_view: 库存查询, stock_inout: 金饰玉石出入库, member_manage: 会员管理, // 国内分公司财务 finance_stat: 财务报表, cost_allocate: 区域成本分摊, gold_price_edit: 金价调整, // 海外专属权限 custom_declare: 海外报关, foreign_exchange: 外币对账, oversea_tax: 境外税务核算, // 集团顶层 org_mgr: 组织架构编辑, role_global: 全局角色配置, data_export_all: 全集团数据导出, } // 海外权限集合 var OVERSEA_PERM_SET map[string]bool{ custom_declare: true, foreign_exchange: true, oversea_tax: true, } // 2. 角色结构体 type Role struct { RoleID string RoleName string Perms map[string]bool } func NewRole(rid, rname string, perms []string) *Role { p : make(map[string]bool) for _, k : range perms { p[k] true } return Role{ RoleID: rid, RoleName: rname, Perms: p, } } // 3. 组织节点 OrgNode 树形结构 type OrgNode struct { OrgID string OrgName string OrgType string ParentID string IsJoin bool // 是否加盟门店隔离递归 Children []*OrgNode // 子组织 Perms map[string]bool // 本组织自有权限 BindRoles []*Role // 绑定角色 } func NewOrgNode(oid, oname, otype, pid string, isJoin bool) *OrgNode { return OrgNode{ OrgID: oid, OrgName: oname, OrgType: otype, ParentID: pid, IsJoin: isJoin, Perms: make(map[string]bool), } } // 添加子节点 func (o *OrgNode) AddChild(child *OrgNode) { o.Children append(o.Children, child) } // 添加自有权限 func (o *OrgNode) AddPerm(key string) { if _, ok : PERMISSION[key]; ok { o.Perms[key] true } } // 绑定角色 func (o *OrgNode) BindRole(r *Role) { o.BindRoles append(o.BindRoles, r) } // 4. 员工用户 type Staff struct { UID string Name string BindOrgID string RolePerms map[string]bool // 用户直接分配权限 } func NewStaff(uid, name, bindOid string) *Staff { return Staff{ UID: uid, Name: name, BindOrgID: bindOid, RolePerms: make(map[string]bool), } } func (s *Staff) AssignPerm(key string) { if _, ok : PERMISSION[key]; ok { s.RolePerms[key] true } } // 5. 销售订单行级过滤 type SaleOrder struct { OrderID string ShopOrgID string Amount float64 } // 6. 递归工具工具类 type OrgUtil struct{} // 6.1 递归查找节点 func (u *OrgUtil) FindNode(root *OrgNode, targetID string) *OrgNode { if root.OrgID targetID { return root } for _, child : range root.Children { res : u.FindNode(child, targetID) if res ! nil { return res } } return nil } // 6.2 向下递归获取所有下级加盟门店终止递归 func (u *OrgUtil) GetAllSubOrgs(root *OrgNode, targetID string) []*OrgNode { target : u.FindNode(root, targetID) if target nil { return nil } var list []*OrgNode var dfs func(node *OrgNode) dfs func(node *OrgNode) { list append(list, node) if node.IsJoin { return } for _, c : range node.Children { dfs(c) } } dfs(target) return list } // 6.3 向上递归获取整条父级链路 func (u *OrgUtil) GetParentChain(root *OrgNode, targetID string, nodeMap map[string]*OrgNode) []*OrgNode { target : u.FindNode(root, targetID) if target nil || target.ParentID { return nil } var parents []*OrgNode var upRecur func(n *OrgNode) upRecur func(n *OrgNode) { pid : n.ParentID if pid { return } pNode, ok : nodeMap[pid] if ok { parents append(parents, pNode) upRecur(pNode) } } upRecur(target) return parents } // 6.4 扩展1角色递归下发全集团 func (u *OrgUtil) RoleSyncRecursive(node *OrgNode, r *Role) { node.BindRole(r) for _, child : range node.Children { u.RoleSyncRecursive(child, r) } } // 6.5 扩展2销售订单行级递归过滤 func (u *OrgUtil) FilterSaleOrders(root *OrgNode, user *Staff, all []*SaleOrder) []*SaleOrder { subList : u.GetAllSubOrgs(root, user.BindOrgID) allowShop : make(map[string]bool) for _, o : range subList { allowShop[o.OrgID] true } var res []*SaleOrder for _, ord : range all { if allowShop[ord.ShopOrgID] { res append(res, ord) } } return res } // 6.6 核心汇总用户完整权限父级自身下级 海外权限隔离 func (u *OrgUtil) GetUserTotalPerms(root *OrgNode, user *Staff, nodeMap map[string]*OrgNode) map[string]bool { total : make(map[string]bool) // 1. 用户自身角色权限 for k : range user.RolePerms { total[k] true } targetNode : u.FindNode(root, user.BindOrgID) if targetNode nil { return total } // 2. 所有父组织 所有下级组织 parentList : u.GetParentChain(root, user.BindOrgID, nodeMap) subList : u.GetAllSubOrgs(root, user.BindOrgID) allOrgs : append(parentList, subList...) for _, org : range allOrgs { // 复制组织权限 tmpPerm : make(map[string]bool) for k : range org.Perms { tmpPerm[k] true } // 国内组织剔除海外权限 if org.OrgType ! 海外子公司 !containsOversea(org.OrgType) { for k : range OVERSEA_PERM_SET { delete(tmpPerm, k) } } // 合并到总权限 for k : range tmpPerm { total[k] true } } return total } func containsOversea(s string) bool { return len(s) 2 s[:2] 海外 } // 6.7 递归打印组织树 func (u *OrgUtil) PrintTree(node *OrgNode, level int) { indent : for i : 0; i level; i { indent } tag : if node.IsJoin { tag [加盟] } fmt.Printf(%s[%s]%s %s (ID:%s)\n, indent, node.OrgType, tag, node.OrgName, node.OrgID) for _, child : range node.Children { u.PrintTree(child, level1) } } // 6.8 递归回收权限 func (u *OrgUtil) RevokePermRecursive(node *OrgNode, permKey string) { delete(node.Perms, permKey) for _, child : range node.Children { u.RevokePermRecursive(child, permKey) } } // 6.9 扩展5递归导出审计报表 type AuditRow struct { Level int OrgID string OrgType string OrgName string IsJoin bool OwnPermNames []string RoleNames []string } func (u *OrgUtil) ExportReport(node *OrgNode, report *[]AuditRow, level int) { // 权限名称 var ownPerms []string for k : range node.Perms { ownPerms append(ownPerms, PERMISSION[k]) } sort.Strings(ownPerms) // 角色名称 var roles []string for _, r : range node.BindRoles { roles append(roles, r.RoleName) } row : AuditRow{ Level: level, OrgID: node.OrgID, OrgType: node.OrgType, OrgName: node.OrgName, IsJoin: node.IsJoin, OwnPermNames: ownPerms, RoleNames: roles, } *report append(*report, row) if node.IsJoin { return } for _, child : range node.Children { u.ExportReport(child, report, level1) } } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Recursion Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/16 22:42 # User : geovindu # Product : GoLand # Project : goalgorithms # File : recursionbll.go */ package bll import ( fmt goalgorithms/recursion sort ) // 构建珠宝集团完整组织树 func buildGroup() (*recursion.OrgNode, map[string]*recursion.OrgNode) { root : recursion.NewOrgNode(G001, 璀璨珠宝集团总部, 集团总部, , false) root.AddPerm(org_mgr) root.AddPerm(role_global) root.AddPerm(data_export_all) root.AddPerm(gold_price_edit) // 国内事业部 domestic : recursion.NewOrgNode(D001, 国内运营事业部, 事业部, G001, false) domestic.AddPerm(finance_stat) domestic.AddPerm(cost_allocate) root.AddChild(domestic) // 华南分公司 huanan : recursion.NewOrgNode(D001-1, 华南分公司, 国内分公司, D001, false) huanan.AddPerm(stock_inout) domestic.AddChild(huanan) szShop : recursion.NewOrgNode(SH-SZ01, 深圳旗舰店, 线下门店, D001-1, false) szShop.AddPerm(sale_view) szShop.AddPerm(sale_create) huanan.AddChild(szShop) joinShop : recursion.NewOrgNode(SH-J001, 东莞加盟门店, 加盟门店, D001-1, true) joinShop.AddPerm(sale_view) huanan.AddChild(joinShop) // 华东分公司 huadong : recursion.NewOrgNode(D001-2, 华东分公司, 国内分公司, D001, false) shShop : recursion.NewOrgNode(SH-SH01, 上海总店, 线下门店, D001-2, false) shShop.AddPerm(sale_create) huadong.AddChild(shShop) domestic.AddChild(huadong) // 海外事业部 oversea : recursion.NewOrgNode(O001, 海外国际事业部, 事业部, G001, false) oversea.AddPerm(foreign_exchange) root.AddChild(oversea) sgCompany : recursion.NewOrgNode(O001-1, 新加坡子公司, 海外子公司, O001, false) sgCompany.AddPerm(custom_declare) sgShop : recursion.NewOrgNode(SH-SG01, 新加坡乌节路门店, 海外门店, O001-1, false) sgShop.AddPerm(sale_view) sgCompany.AddChild(sgShop) oversea.AddChild(sgCompany) usCompany : recursion.NewOrgNode(O001-2, 洛杉矶子公司, 海外子公司, O001, false) usCompany.AddPerm(oversea_tax) usShop : recursion.NewOrgNode(SH-US01, 洛杉矶门店, 海外门店, O001-2, false) usShop.AddPerm(sale_view) usCompany.AddChild(usShop) oversea.AddChild(usCompany) // 构建ID映射表 nodeMap : make(map[string]*recursion.OrgNode) var collect func(n *recursion.OrgNode) collect func(n *recursion.OrgNode) { nodeMap[n.OrgID] n for _, c : range n.Children { collect(c) } } collect(root) return root, nodeMap } func RecursionMain() { root, nodeMap : buildGroup() util : recursion.OrgUtil{} fmt.Println( 1. 完整组织树含加盟门店标记 ) util.PrintTree(root, 0) // 扩展1角色递归下发全集团 globalSaleRole : recursion.NewRole(R001, 集团通用销售角色, []string{sale_view, stock_view}) util.RoleSyncRecursive(root, globalSaleRole) fmt.Println(\n 【扩展1】角色递归下发完成全集团绑定销售角色 ) // 模拟订单 allOrders : []*recursion.SaleOrder{ {OD001, SH-SZ01, 12800}, {OD002, SH-J001, 6500}, {OD003, SH-SH01, 23000}, {OD004, SH-SG01, 9600}, } // 华南管理员 southAdmin : recursion.NewStaff(U2001, 华南运营总监, D001-1) // 扩展2行级过滤订单 fmt.Println(\n 【扩展2】华南管理员行级过滤后的销售订单 ) filterOrd : util.FilterSaleOrders(root, southAdmin, allOrders) for _, o : range filterOrd { fmt.Printf(订单%s 门店ID:%s 金额:%.0f\n, o.OrderID, o.ShopOrgID, o.Amount) } // 扩展3/4权限汇总国内屏蔽海外权限 fmt.Println(\n 【扩展3/4】华南管理员权限无海外报关/外币权限 ) southPerm : util.GetUserTotalPerms(root, southAdmin, nodeMap) var southList []string for k : range southPerm { southList append(southList, recursion.PERMISSION[k]) } sort.Strings(southList) for _, name : range southList { fmt.Printf(- %s\n, name) } // 新加坡海外管理员 sgAdmin : recursion.NewStaff(U3001, 新加坡负责人, O001-1) fmt.Println(\n 海外子公司管理员权限包含海外专属权限 ) sgPerm : util.GetUserTotalPerms(root, sgAdmin, nodeMap) var sgList []string for k : range sgPerm { sgList append(sgList, recursion.PERMISSION[k]) } sort.Strings(sgList) for _, name : range sgList { fmt.Printf(- %s\n, name) } // 扩展5递归导出审计报表 fmt.Println(\n 【扩展5】递归导出集团审计权限报表 ) var report []recursion.AuditRow util.ExportReport(root, report, 0) for _, row : range report { indent : for i : 0; i row.Level; i { indent } joinTag : if row.IsJoin { joinTag 【加盟】 } fmt.Printf(%s%s%s | 自有权限:%v | 绑定角色:%v\n, indent, joinTag, row.OrgName, row.OwnPermNames, row.RoleNames) } }输出

相关新闻

AI模型评估与基准测试:从GLUE到MMLU的演进

AI模型评估与基准测试:从GLUE到MMLU的演进

2026/7/17 0:40:58

AI模型评估与基准测试:从GLUE到MMLU的演进模型评估是AI发展的基石。从早期的单一任务准确率到现代的综合能力基准,评估体系经历了根本性变革。本文将系统梳理NLP和通用AI评估基准的演进,分析各类评测的设计原理和局限性,帮助读者建…

AI大模型长上下文技术:从滑动窗口到无限上下文

AI大模型长上下文技术:从滑动窗口到无限上下文

2026/7/17 0:40:58

AI大模型长上下文技术:从滑动窗口到无限上下文大语言模型的上下文长度从早期的2K tokens扩展到如今的数百万tokens,这一突破正在重塑AI应用的可能性边界。从文档理解到代码分析,从多轮对话到视频理解,长上下文能力成为衡量模型实用…

2026 指挥中心控制台技术选型与厂商实测|科思诺 KESINO、铁力山、飞马、照彰实业对比

2026 指挥中心控制台技术选型与厂商实测|科思诺 KESINO、铁力山、飞马、照彰实业对比

2026/7/17 0:40:58

前言在智慧城市、公安应急、轨道交通、能源调度、金融运维等领域,指挥中心 / 控制室控制台是保障 724 小时值守、多系统协同、应急指挥闭环的关键硬件底座。控制台的结构设计、布线散热、人体工学、定制扩展与交付运维能力,直接决定系统稳定性与长期使用…

DocsGPT开源平台:基于RAG技术的企业级智能文档助手部署指南

DocsGPT开源平台:基于RAG技术的企业级智能文档助手部署指南

2026/7/17 2:21:03

如果你正在为团队或企业构建智能助手,却苦于文档格式兼容性差、模型选择受限、部署复杂等问题,那么 DocsGPT 可能正是你需要的解决方案。这个开源项目在 GitHub 上已经获得超过 18k 星标,它不仅仅是一个简单的文档问答工具,而是一…

解决Linux开机自动加载kvm_amd模块问题

解决Linux开机自动加载kvm_amd模块问题

2026/7/17 2:21:03

1. 问题背景:为什么每次开机都要手动加载kvm_amd模块?作为一名长期使用KVM虚拟化技术的开发者,我经常遇到这样的困扰:明明已经安装了KVM相关组件,但每次重启后都需要手动执行modprobe kvm_amd才能正常使用虚拟化功能。…

RAG技术进阶:从基础检索到智能推理的42+实战方案

RAG技术进阶:从基础检索到智能推理的42+实战方案

2026/7/17 2:21:03

在尝试构建一个能够回答复杂问题的智能系统时,很多开发者都会遇到一个共同的困境:简单的关键词匹配或语义搜索往往只能找到表面相关的信息,而真正需要深入理解文档内容、进行多步推理的问题,却总是得不到满意的答案。这就是为什么…

DeepSeek MODEL1架构泄露:Engram记忆系统与MoE双稀疏度设计解析

DeepSeek MODEL1架构泄露:Engram记忆系统与MoE双稀疏度设计解析

2026/7/17 2:21:03

1. DeepSeek MODEL1架构泄露事件始末2026年1月21日,DeepSeek的FlashMLA代码库意外泄露了代号为"MODEL1"的技术文档,涉及114个文件中的28处关键引用。这次泄露之所以引发行业震动,是因为其内容与arXiv论文2601.07372描述的Engram记忆…

全志V3s GPIO驱动三套实战方案:传统字符设备、platform总线、设备树适配

全志V3s GPIO驱动三套实战方案:传统字符设备、platform总线、设备树适配

2026/7/17 2:21:03

本文还有配套的精品资源,点击获取 简介:包含全志V3s平台下三种Linux GPIO驱动实现方式的完整可运行代码包:Way1是基于字符设备的传统驱动模型,直接操作寄存器,适合理解底层硬件控制;Way2采用platform总线…

AI黑箱揭秘:可解释性技术与行业实践

AI黑箱揭秘:可解释性技术与行业实践

2026/7/17 2:11:02

1. 为什么我们需要"揭开盖子"看AI?当邻居家的小孩第一次看到自动扫地机器人工作时,他蹲下来试图掀开机器人的盖子,想看看"里面是不是藏了个小人"。这个场景完美诠释了当下大众对人工智能的认知状态——我们都知道AI能做很…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/16 0:35:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/16 14:29:31

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/16 14:18:17

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

2026/7/17 0:00:57

更多请点击: https://intelliparadigm.com 第一章:Cursor终端插件生态避坑指南概览 Cursor 作为基于 VS Code 内核构建的 AI 原生编辑器,其终端插件生态虽活跃,但存在兼容性断层、权限策略突变与调试链路断裂等典型风险。开发者常…

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

2026/7/17 0:00:57

更多请点击: https://codechina.net 第一章:ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表) 提示词工程已从经验试错迈入变量驱动的科学阶段。实证研究表明,影响…

DeepSeek V4替换Codex底座模型的实践与优化

DeepSeek V4替换Codex底座模型的实践与优化

2026/7/17 0:00:57

1. 为什么选择用DeepSeek V4替换Codex的底座模型去年我在开发一个智能代码补全工具时,发现Codex的默认底座模型在复杂业务逻辑场景下表现不尽如人意。经过多次测试对比,DeepSeek V4在以下几个关键指标上展现出明显优势:代码补全准确率&#x…