当前位置: 首页 > article >正文

Go语言实现链式调用

在 Go 语言中实现链式调用(Method Chaining),可以通过让每个方法返回对象本身(或对象的指针)来实现。这样每次方法调用后可以继续调用其他方法。

示例:实现字符串的链式操作

假设你想对一个字符串连续执行 TrimSuffixTrimPrefixToUpper 等操作,可以自定义一个类型并为其定义方法:

1. 定义包装类型
type StringWrapper struct {value string
}// 构造函数
func NewStringWrapper(s string) *StringWrapper {return &StringWrapper{value: s}
}// 获取最终结果
func (sw *StringWrapper) String() string {return sw.value
}
2. 实现链式方法

每个方法返回 *StringWrapper,以便继续调用其他方法:

// TrimSuffix 链式调用
func (sw *StringWrapper) TrimSuffix(suffix string) *StringWrapper {sw.value = strings.TrimSuffix(sw.value, suffix)return sw // 返回自身指针
}// TrimPrefix 链式调用
func (sw *StringWrapper) TrimPrefix(prefix string) *StringWrapper {sw.value = strings.TrimPrefix(sw.value, prefix)return sw
}// ToUpper 链式调用
func (sw *StringWrapper) ToUpper() *StringWrapper {sw.value = strings.ToUpper(sw.value)return sw
}
3. 使用示例
func main() {s := NewStringWrapper("  hello, world!  ").TrimPrefix("  ").    // 去掉前缀空格TrimSuffix("!  ").   // 去掉后缀 "!  "ToUpper().           // 转为大写String()             // 获取最终结果fmt.Println(s) // 输出: "HELLO, WORLD"
}

更简洁的实现(直接扩展 string 类型)

Go 不允许直接为内置类型(如 string)添加方法,但可以通过类型别名实现:

type MyString stringfunc (ms MyString) TrimSuffix(suffix string) MyString {return MyString(strings.TrimSuffix(string(ms), suffix))
}func (ms MyString) TrimPrefix(prefix string) MyString {return MyString(strings.TrimPrefix(string(ms), prefix))
}func main() {result := MyString("  hello!  ").TrimPrefix("  ").TrimSuffix("!  ")fmt.Println(result) // 输出: "hello"
}

关键点

  1. 返回对象自身:每个方法返回 *StringWrapper 或类型别名,以支持链式调用。
  2. 不可变 vs 可变
    • 上例中 StringWrapper可变的(修改原对象)。
    • 若希望每次操作生成新对象(类似字符串的不可变性),可以返回新实例:
      func (sw StringWrapper) TrimSuffix(suffix string) StringWrapper {return StringWrapper{value: strings.TrimSuffix(sw.value, suffix)}
      }
      

实际应用场景

  • Builder 模式(如 strings.Builderbytes.Buffer)。
  • 流式 API 设计(如数据库查询构造器)。

通过链式调用,代码可以更流畅(Fluent Interface),但需注意避免过度使用导致调试困难。

http://www.lryc.cn/news/2378953.html

相关文章:

  • 重排序模型解读 mxbai-rerank-base-v2 强大的重排序模型
  • 期望是什么:(无数次的均值,结合概率)21/6=3.5
  • uniapp-vue3项目中引入高德地图的天气展示
  • 容器化-k8s-介绍及下载安装教程
  • lc42接雨水
  • 通义千问-langchain使用构建(三)
  • uniapp自动构建pages.json的vite插件
  • 系统漏洞扫描服务:维护网络安全的关键与服务原理?
  • nlf loss 学习笔记
  • 【Redis】零碎知识点(易忘 / 易错)总结回顾
  • 基于three.js 全景图片或视频开源库Photo Sphere Viewer
  • LangPDF: Empowering Your PDFs with Intelligent Language Processing
  • OpenVLA (2) 机器人环境和环境数据
  • 代码复现5——VLMaps
  • Ocean: Object-aware Anchor-free Tracking
  • 计算机网络(1)——概述
  • 刘家祎双剧收官见证蜕变,诠释多面人生
  • Axure制作可视化大屏动态滚动列表教程
  • MATLAB实现振幅调制(AM调制信号)
  • LLM-Based Agent综述及其框架学习(五)
  • 6.1.1图的基本概念
  • Linux面试题集合(6)
  • 时间筛掉了不够坚定的东西
  • Python集合运算:从基础到进阶全解析
  • jvm安全点(二)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞
  • YOLOv7训练时4个类别只出2个类别
  • 【论文阅读】针对BEV感知的攻击
  • 18.中介者模式:思考与解读
  • flutter 配置 安卓、Ios启动图
  • 基于朴素贝叶斯与 LSTM 的假新闻检测模型对比分析