Go语言中的dedup程序与集合映射在银行案例中的应用

需积分: 50 30 下载量 141 浏览量 更新于2024-08-07 收藏 5.85MB PDF 举报
在"节中出现的dup程序-构建敏捷银行-平安银行信用卡中心转型案例"这篇文章中,主要讨论的是如何利用Go语言实现去重(deduplication)的功能,特别是通过一个名为`dedup`的程序来演示。这个程序的核心在于利用Go语言的map数据结构来实现。Map在Go中被程序员广泛用作一种关联数组,它存储键值对,其中键是唯一的。在这个场景中,`seen` map是一个布尔型映射(map[string]bool),用来记录已读取过的行,确保不重复打印。 程序通过`bufio.Scanner`逐行读取输入,每当遇到新的行(即尚未存在于`seen` map中的字符串),就将其添加到map中并打印出来。这实现了线程安全且空间效率高的去重逻辑,因为map的查找和插入操作在平均情况下具有O(1)的时间复杂度。 此外,文章还提到了Go语言中对map的使用习惯,尽管`map[string]bool`看起来像是一个简单的键值对,但其实它的value(布尔值)并不是完全无关紧要的,因为在某些情况下,它们可能会承载重要的状态信息。例如,这里它们用来标记行是否已经读过。 对于不能直接用作map键的非可比较类型(如slice),文章提供了一种间接方法:首先定义一个辅助函数`k`,将slice转换为可比较的字符串类型,然后使用这个辅助函数作为新map的键。这样可以确保在处理slice类型的键时,只有当它们内容相等时才会被认为是相同的键。 文章的上下文还提到Go语言的发展历史,它深受C语言的影响,尤其是在语法、控制流、数据类型和性能优化方面。然而,Go并非单纯模仿C,而是融合了多种编程语言的特点,比如Pascal和Modula-2的语言设计,尤其是包(package)的概念和Oberon系列语言的面向对象特性。Go还受到了Tony Hoare的并发理论CSP(Communicating Sequential Processes)的启发,这种理论强调无共享状态的并发进程间的通信,这在Go的goroutine和channel机制中得以体现。 Rob Pike等人在将CSP概念应用到实践中时,先后尝试了Squeak和Newsqueak等语言,这些语言为Go的并发和管道(channel)设计提供了关键思路。最终,Alef语言在Plan9操作系统中整合了这些创新,为Go语言的诞生奠定了基础。 总结来说,本文通过实际代码展示了Go语言中map的高效用法,并探讨了Go语言背后的历史渊源和其独特特性的形成过程,强调了Go在并发和数据结构上的设计哲学。
2023-06-10 上传

给出dosbox画圆程序的前半部分代码,为该代码添加注释,在结尾给出简易流程说明 data segment shuc db 'draw a yuan: $' hua1 db 'input yuanxin and banjing(example:310,220 200): $' zifu db 20 dup(0) ;此段用以临时存放输入字符 shu db 20 dup(0) ; suan db 24 dup(0) ;用来存放计算圆过程中产生的临时数据 data ends stack segment stk db 16 dup(0) stack ends code segment assume cs:code, ds:data,ss:stack start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov dx,offset shuc ;显示输入C的提示字符 call showmsg call input ;输入字符c的处理 mov al,ds:[si] and al,11011111b ;便于大小写都识别,将字符转换成大写 cmp al,43h draw1: mov dx,offset hua1 call showmsg call input call zhuanshu call moshi mov bx,offset shu mov ax,ds:[bx] mov si,ax mov ax,ds:[bx+2] mov di,ax mov ax,ds:[bx+4] call drawyuan mov ax,4c00h int 21h ;--------------------------------------- input: ;实现键盘输入字符 mov bx,0 mov cx,20 re: mov ah,1h ;DOS中断 键盘键入回显,al为字符 int 21h cmp al,0dh ;0dh为回车的ASCII码 jz scx mov si,offset zifu mov [bx][si],al ;将输入的字符放到zifu区 inc bx loop re ret ;-------------------------------------- scx: ;条件跳转时对cx设置 mov cx,0 ret ;-------------------------------------- showmsg: ;用来显示提示字符 mov ah,9h int 21h ret ;-------------------------------------- moshi: ;屏幕显示模式 mov al,12h mov ah,0 int 10h ret ;------------------------------------- zhuanshu: ;将输入的ascII码转为数字 mov bx,offset zifu mov bp,offset shu mov cx,16 mov si,0 mov di,0 lei: mov al,ds:[bx][si] cmp al,0 jz scx sub al,30h mov dl,100 mul dl mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+1] sub al,30h mov dl,10 mul dl add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+2] sub al,30h add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax add si,4 add di,2 loop lei ret

2023-05-31 上传