go语言字符串的链式处理——操作与数据分离的设计技巧-csdn博客


本站和网页 https://blog.csdn.net/xyz/article/details/120027859 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Go语言字符串的链式处理——操作与数据分离的设计技巧-CSDN博客
Go语言字符串的链式处理——操作与数据分离的设计技巧
最新推荐文章于 2022-10-25 20:38:06 发布
xyz 阅读量827 收藏 4 点赞数 1 分类专栏: GoLang 文章标签: golang 数据库 原文链接:
https://mp.csdn.net/mp_blog/creation/editor
版权
专栏收录该内容
131 篇文章
11 订阅
订阅专栏
使用 SQL 语言从数据库中获取数据时,可以对原始数据进行排序(sort by)、分组(group by)和去重(distinct)等操作。SQL 将数据的操作与遍历过程作为两个部分进行隔离,这样操作和遍历过程就可以各自独立地进行设计,这就是常见的数据与操作分离的设计。
对数据的操作进行多步骤的处理被称为链式处理。本例中使用多个字符串作为数据集合,然后对每个字符串进行一系列的处理,用户可以通过系统函数或者自定义函数对链式处理中的每个环节进行自定义。
首先给出本节完整代码:
package main
import (
"fmt"
"strings"
// 字符串处理函数,传入字符串切片和处理链
func StringProccess(list []string, chain []func(string) string) {
// 遍历每一个字符串
for index, str := range list {
// 第一个需要处理的字符串
result := str
// 遍历每一个处理链
for _, proc := range chain {
// 输入一个字符串进行处理,返回数据作为下一个处理链的输入。
result = proc(result)
// 将结果放回切片
list[index] = result
// 自定义的移除前缀的处理函数
func removePrefix(str string) string {
return strings.TrimPrefix(str, "go")
func main() {
// 待处理的字符串列表
list := []string{
"go scanner",
"go parser",
"go compiler",
"go printer",
"go formater",
// 处理函数链
chain := []func(string) string{
removePrefix,
strings.TrimSpace,
strings.ToUpper,
// 处理字符串
StringProccess(list, chain)
// 输出处理好的字符串
for _, str := range list {
fmt.Println(str)
1) 字符串处理函数
字符串处理函数(StringProccess)需要外部提供数据源:一个字符串切片(list[]string),另外还要提供一个链式处理函数的切片(chain[]func(string)string),链式处理切片中的一个处理函数的定义如下:
func(string)string
这种处理函数能够接受一个字符串输入,处理后输出。
strings 包中将字符串变为小写就是一种处理函数的形式,strings.ToLower() 函数能够将传入的字符串的每一个字符变为小写,strings.ToLower 定义如下:
func ToLower(s string) string
字符串处理函数(StringProccess)内部遍历每一个数据源提供的字符串,每个字符串都需要经过一系列链式处理函数处理后被重新放回切片,参见下面代码。
字符串的链式处理:
// 字符串处理函数, 传入字符串切片和处理链
// 输入一个字符串进行处理, 返回数据作为下一个处理链的输入
代码说明如下:
第 2 行,传入字符串切片 list 作为数据源,一系列的处理函数作为 chain 处理链。
第 5 行,遍历字符串切片的每个字符串,依次对每个字符串进行处理。
第 8 行,将当前字符串保存到 result 变量中,作为第一个处理函数的参数。
第 11 行,遍历每一个处理函数,将字符串按顺序经过这些处理函数处理。
第 14 行,result 变量即是每个处理函数的输入变量,处理后的变量又会重新保存到 result 变量中。
第 18 行,将处理完的字符串保存回切片中。
2) 自定义的处理函数
处理函数可以是系统提供的处理函数,如将字符串变大写或小写,也可以使用自定义函数。本例中的字符串处理的逻辑是使用一个自定义的函数实现移除指定go前缀的过程,参见下面代码:
此函数使用了 strings.TrimPrefix() 函数实现移除字符串的指定前缀。处理后,移除前缀的字符串结果将通过 removePrefix() 函数的返回值返回。
3) 字符串处理主流程
字符串处理的主流程包含以下几个步骤:
准备要处理的字符串列表。
准备字符串处理链。
处理字符串列表。
打印输出后的字符串列表。
详细流程参考下面的代码:
第 4 行,定义字符串切片,字符串包含 go 前缀及空格。
第 13 行,准备处理每个字符串的处理链,处理的顺序与函数在切片中的位置一致。removePrefix() 为自定义的函数,功能是移除 go 前缀;移除前缀的字符串左边有一个空格,使用 strings.TrimSpace 移除,这个函数的定义刚好符合处理函数的格式:func(string)string;strings.ToUpper 用于将字符串转为大写。
第 20 行,传入字符串切片和字符串处理链,通过 StringProcess() 函数对字符串进行处理。
第 23 行,遍历字符串切片的每一个字符串,打印处理好的字符串结果。
提示
链式处理器是一种常见的编程设计。Netty 是使用 Java 语言编写的一款异步事件驱动的网络应用程序框架,支持快速开发可维护的高性能的面向协议的服务器和客户端,Netty 中就有类似的链式处理器的设计。
Netty 可以使用类似的处理链对封包进行收发编码及处理。Netty 的开发者可以分为 3 种:第一种是 Netty 底层开发者,第二种是每个处理环节的开发者,第三种是业务实现者,在实际开发环节中,后两种开发者往往是同一批开发者。链式处理的开发思想将数据和操作拆分、解耦,让开发者可以根据自己的技术优势和需求,进行系统开发,同时将自己的开发成果共享给其他的开发者。
优惠劵
关注
点赞
觉得还不错?
一键收藏
知道了
评论
使用 SQL 语言从数据库中获取数据时,可以对原始数据进行排序(sort by)、分组(group by)和去重(distinct)等操作。SQL 将数据的操作与遍历过程作为两个部分进行隔离,这样操作和遍历过程就可以各自独立地进行设计,这就是常见的数据与操作分离的设计。对数据的操作进行多步骤的处理被称为链式处理。本例中使用多个字符串作为数据集合,然后对每个字符串进行一系列的处理,用户可以通过系统函数或者自定义函数对链式处理中的每个环节进行自定义。首先给出本节完整代码:package mai
复制链接
扫一扫
专栏目录
开源
Go语言
数值算法库 An open numerical library purely based on Go programming language
chfenger的博客
12-19
623
数值算法库 An open numerical library purely based on Go programming language关于[goNum](https://github.com/chfenger/goNum)安装环境安装方法算法许可证书致谢
关于goNum
goNum是一款完全以
为基础的开源数值算法库,它可以使你像调用其它go函数一样使用其进行数值运算,且...
CUDA学习笔记(LU分解)
qq_22677425的博客
05-14
5765
nbsp;
 
最近在学习LU的并行加速,从paper中得到了一些idea,就想着用GPU来实现一下。学习CUDA的过程中踩了不少坑,不过最终还是完成了测试。
一、LU算法
LU 分解是计算机做矩阵运算过程中重要的一步,通过将矩阵分解为一个上三角矩阵U和下三角矩阵L,能够有效的缩短计算时间。
LU分解的计算过程如下,采用高斯消元法。
基本算法
void lud_b...
1 条评论
您还未登录,请先
登录
后发表或查看评论
第05章
函数(
func)
热门推荐
心情第一
10-26
1万+
函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段,其可以提高应用的模块性和代码的重复利用率。
Go 语言支持普通函数、匿名函数和闭包,从
设计
上对函数进行了优化和改进,让函数使用起来更加方便。
Go 语言的函数属于“一等公民”(first-class),也就是说:
函数本身可以作为值进行传递。
支持匿名函数和闭包(closure)。
函数可以满足接口。
本章内容:
5.1
函数声明(函数定义)
函数构成了代码执行的逻辑结构,在
中,函数的基本组成为:关键字 func、函数.
go语言
从入门到进阶实战》知识点总结概要
linsistnc的博客
04-12
453
本书主要从初识
基本语法和使用、容器:存储和组织
数据
的方式、流程控制、函数、结构体、接口、包、并发、反射、编译与工具、避坑与
技巧
、实战演练(剖析cellent的网络库
并实现socket聊天功能)
书籍封面
Xmid百度网盘下载地址
链接:https://pan.baidu.com/s/1SYXdE0HInE9PnQ8bwCzuEw
提取码:6b1u
...
字符串
链式
处理
LoongTu
04-26
425
用多个函数对
进行
"fmt"
"strings"
return strings.TrimPrefix(str, "go")
//
函数,传入
切片和
func StringProcess(list []string, ch...
GO语言
实现
操作
Xiang_lhh的博客
11-17
3903
,基本原理就是返回值是一个结构体的对象。
import "fmt"
type Student struct {
name string
age
int
sex
id
string
func (this *Student) index() *Student {
return this
func (this *Student) getname() {
fmt.Println(this.name)
Go 小
调用
叮当猫的喵i
11-16
1197
参考
[GO]小
,如何实现一个
使用
// 主要就是 前一个方法的返回值,具有下一个方法,因此可以实现
type Stu struct {
Name string
Age
func (p *Stu) SetName(name string) *Stu {
p.Name = name
return p
func (p *Stu) SetAge(age int) *Stu {
的几个
分享
01-01
一、
底层就是一个字节数组 这真的非常重要,而且影响着下面的其他几个
。当你创建一个
时,其本质就是一个字节的数组。这意味着你可以像访问数组一样的访问单独的某个字节。例如,下面的代码逐个打印...
结构实验——
相关
05-13
本人本科学习期间
结构的第三个实验 1、实现串赋值、串比较、求串长、串联接、求子串以及串匹配(KMP...2、能利用上述实现的基本
完成置换Replace (&S, T, V)以及从串中删除一段子串StrDelete(&S,pos,len)的
常用
方法实例汇总
09-22
主要介绍了
方法,实例汇总了
中常见的各种
,具有一定参考借鉴价值,需要的朋友可以参考下
中的
方法示例详解
09-20
是使用UTF-8编码的。UTF-8是Unicode的实现方式之一。这篇文章主要介绍了
方法,需要的朋友可以参考下
从入门到进阶实战》学习笔记:第五章 函数
qq_36214481的博客
03-24
293
(1)函数本身可以作为值进行传递。
(2)支持匿名函数和闭包(closure)。
(3)函数可以满足接口。
5.1函数声明
1、普通函数声明形式
func 函数名(参数列表) (返回参数列表){
函数体
2、参数类型简写
func add(a,b int) int{
return a+b
3、函数的返回值
(1)带有变量名的返回值
func ...
串的
存储及其基本
qq_57484399的博客
10-25
3370
我们大部分时间都是在使用数组来存储串 , 然后进行
的 , 对于链串我们不经常使用, 在这里我们为了练习的需要 , 实现一下链串的基本
, 其实也就是插入,删除, 替换 ,然后指针的交替罢了.我们通常的
是 在链串里面 ,每个节点存储四个字节的
, 就是一个字的
, 在这个我们方便对
, 每个 节点只放一个字节 , 那一个节点明明可以存储 4 个字节 , 我们只存一个字节 ,那就会空余 3 个字节的空间 , 那也没办法 , 继续
即可。
结构 ------
串的基本
玩转Java
03-26
2260
这里采用串的
存储结构,在明白了单链表的基本原理基础上,再理解串的
存储以及相关
就通俗易懂了。
这里要注意的是,p->next:指向第一个字符,刚开始创建的p为头结点,然后需要注意的地方就是这里的
r->next =q; r =q; 这里的意思是将q指针放在r->next的后面,接着r指针移动q指针的位置. 还有一种就是(q->next =r->next,r->next =q;)主要注意 q->next = r-&
结构】
Ctrl AC的博客
03-11
1417
“ Ctrl AC!一起 AC!”
目录
结点的定义:
创建
插入:
删除:
连接:
截取子串
存储称为
typedef struct node{
char data;
struct node *next;
}linkstrnode;
typedef linkstrnode *linkstring;
void strcreate(linkstring *S){
char ch;
linkstrnode
33-串的
存储结构和基本
网络安全
06-22
8251
1. 串的
存储结构
  串的
存储结构与线性表是相似的,但是在
存储结构中每个节点的
域可以是一个字符,或者多个字符。如果每个节点的
域是以一个字符存储的话,由于内存对齐的的影响下,链串的存储密度较小,因此会存在浪费。
  如果每个节点的
域是以四个字符存储的话,链串的存储密度较大,即便在内存对齐的的影响下,也不容易浪费空间。
关于内存对齐,假设每个节点的
域以一...
一一
分离
OceanStar的博客
01-02
2437
加了fallthrough后,会直接运行【紧跟的后一个】case或default语句,不论条件是否满足都会执行,后面的条件并不会再判断了,
模式系列:搞懂访问者模式,
结构与
风雨编码路的博客
04-08
740
访问者模式的定义:将
结构和对
结构中元素的
,并把对
封装,使其在不改变
结构的前提下可以添加新的
,为
结构中的每个元素提供多种访问方式。属于行为型模式。
访问者模式的核心是解耦
结构和
,使得对元素的
更容易扩展。
结构的简单
Feynman1999的博客
04-14
687
#include
#define max_size 200
using namespace std;
char p[max_size];
typedef struct strnode{
strnode *next;
}strnode,*pstr;
void strassign(pstr &s,char *p)//初始化赋值
pstr q;
判等
最新发布
07-14
在 Go 语言中,可以使用 `==` 运算符来判断两个
是否相等。示例如下:
```go
str1 := "Hello"
str2 := "World"
if str1 == str2 {
fmt.Println("
相等")
} else {
不相等")
```
输出结果为:
不相等。
另外,需要注意的是,Go 语言中的
是不可变的,即一旦创建后就不能修改。如果需要对
进行修改或者比较
,可以使用 `strings` 包提供的相关函数。例如,可以使用 `strings.Compare()` 函数来比较两个
if strings.Compare(str1, str2) == 0 {
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
CSDN认证博客专家
CSDN认证企业博客
码龄24年
暂无认证
76
原创
5万+
周排名
211万+
总排名
40万+
访问
等级
1755
积分
43
粉丝
获赞
17
417
私信
热门文章
Linux 打包压缩-文件压缩-压缩工具【unzip】解压使用基本介绍
123142
Dockerfile CMD 命令详解
35211
Linux 如何杀死一个进程和它的所有子进程
11020
Java java.awt.headless=true 的具体作用
10323
Linux 打包压缩-文件打包-打包工具【tar】命令使用简介
7223
分类专栏
笔记
LeetCode
1篇
Computer
Thinking
2篇
DevOps
Keep Effective保持高效
Linux
109篇
Linux Shell
14篇
Linux 计划任务
Linux 内存管理
Linux 网络安全
Linux 网络服务器
Linux 网络通讯
Linux 软件管理
9篇
Linux 进程与作业管理
15篇
Linux 磁盘管理
Linux 系统安全
Linux 系统管理
8篇
Linux 文件管理
44篇
Linux 用户和工作组管理
11篇
Linux 硬件管理
Linux 内核管理
Linux 性能检测优化
Linux 打印命令
Linux 文件传输
虚拟化
Linux 打包压缩
6篇
vmware
OpenStack
Java
64篇
事务控制
JVM
Exception
Spring
Logging
webserver
SQL
7篇
多线程
31篇
Spring Cloud Alibaba
SpringBoot
定时器
SpringCloud
RocketMQ
CodingTime
131篇
Rancher
4篇
Kubernetes
Docker
DockerImage
DockerFile
Docker Drivers
Docker API
Docker Compose
Docker Source Code
Docker Command Line
Jenkins
Redis
Nexus
Maven
Git
最新评论
Go语言-【接口interface】-接口内部实现
JTryer:
你都说了你是转载的为什么原文链接要随便找了个链接放上去啊
为什么java不推荐使用vector?
ststeec:
vector只能在尾部插入吗?
List<Integer> list = new Vector();
for(i=0;i<3;i++){list.add(i);}
list.add(1,5);
System.out.println(list);
//输出[0,5,1,2]
Go语言模拟枚举(const和iota模拟枚举)
m0_54954055:
很清晰透彻,太实用了
Linux 磁盘管理-分区管理-磁盘修复-断电导致磁盘损坏【fsck】修复异常磁盘
ch654hjvg:
感谢,有用
Go语言字符串的链式处理——操作与数据分离的设计技巧
尧恺星:
这跟链式处理有半毛钱关系
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
最新文章
golang高并发模型
Go语言CSP:通信顺序进程简述
Go语言封装qsort快速排序函数
2021年
325篇
2020年
10篇
2019年
3篇
2018年
评论 
被折叠的 
 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
红包个数最小为10个
红包总金额
红包金额最低5元
余额支付
当前余额
3.43
前往充值 >
需支付:
10.00
取消
确定
下一步
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值