文档章节

golang 多线程查找文件内容

m
 modprobe
发布于 2016/11/08 09:57
字数 271
阅读 14
收藏 0
 1 package main
 2 
 3 import (
 4     "fmt"
 5     "io/ioutil"
 6     "os"
 7     "path/filepath"
 8     "strings"
 9 )
10 
11 var matchCount = 0
12 var ch = make(chan int, 512)
13 
14 func findFile(path string, text string) {
15     var pathArray [100]string
16     var count = 0
17     filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
18         if err != nil {
19         }
20         //find text
21         if !info.IsDir() {
22             if info.Size() < 1024*1024 {
23                 pathArray[count] = path
24                 count++
25                 if count >= 100 {
26                     count = 0
27                     go findText(pathArray[0:100], text)
28                     <-ch
29                 }
30             }
31         }
32         return nil
33     })
34     go findText(pathArray[0:count], text)
35     <-ch
36 
37     fmt.Printf("一共发现了 %d 个匹配的文件", matchCount)
38 
39 }
40 
41 func findText(paths []string, text string) {
42     for _, path := range paths {
43         fi, err := os.Open(path)
44         if err != nil {
45             panic(err)
46         }
47         defer fi.Close()
48         fd, err := ioutil.ReadAll(fi)
49         if err != nil {
50             panic(err)
51         }
52 
53         if strings.Index(string(fd), text) > -1 {
54             matchCount++
55             fmt.Println(path)
56         }
57     }
58     ch <- 1
59 }
60 
61 func main() {
62     args := os.Args
63     if len(args) < 3 {
64         fmt.Println("需要两个参数 path text")
65         return
66     }
67     path := args[1]
68     text := args[2]
69 
70     _, err := os.Stat(path)
71 
72     if err != nil {
73         fmt.Println("path不存在")
74     } else {
75         findFile(path, text)
76     }
77 }

 计数器增加的时候应该加锁

本文转载自:http://www.cnblogs.com/modprobe/p/4302686.html

共有 人打赏支持
m
粉丝 1
博文 35
码字总数 0
作品 0
私信 提问
基于Golang的IP地址信息查询服务

https://github.com/miraclesu/ipip 工作中经常会有通过IP匹配用户信息的需求,如确定用户所在的地区(国家/省份/城市)、运营商、时区、经纬度等等。前一阵有个Golang开发的项目也有这样的需...

mickelfeng
2017/11/22
0
0
Golang学习笔记目录

Golang 介绍 Go语言是谷歌2009发布的第二款开源编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。...

ChainZhang
2017/12/26
0
0
golang 中的包管理

声明:本文仅限于简书发布,其他第三方网站均为盗版,原文地址: golang 中的包管理 对于习惯了 Java 和 Python 的程序员来说,对于包的管理都有着比较大的期望,当然,虽然 Java 和 Python...

yetship
2017/11/06
0
0
从0开始打造一个独立内存的缓存系统

1前言 缓存是后端使用得最多的东西,因为性能是后端开发一个重要的特征,所以缓存就应运而生了,而且现在缓存已经到了泛滥的程度了,我几乎没见过没有缓存的后端,一遇到性能问题,首先想到的...

吴坚
2016/08/12
0
0
升级golang版本导致vscode中golang没有代码提示问题处理

上半年安装了vscode中golang的插件,经过折腾代码提示这些都好了,但当时goland还可以用,就放弃了vscode来编写golang。下半年go升级1.11,最新版的goland没法用licence server激活了,又把v...

一路向北的兔斯基
11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

esxi 更换ssl证书

概述 就是想换一个证书而已,你可以通过下面的途径去申请一个泛解析域名的证书之后再esxi上安装上 使用阿里云域名api申请Let’s Encrypt泛域名免费ssl证书 申请完成证书之后进行下一步 操作 ...

bboysoulcn
4分钟前
0
0
PLC编程入门:梯形图

梯形图(LAD)是PLC编程的最佳可视化语言,它看起来非常类似于继电器电路图,因此如果 你对继电器控制和电子电路有所了解的话,那么学起来会非常容易! 在这个教程中,我们将学习关于使用梯形...

汇智网教程
7分钟前
0
0
Kubernetes 1.13.0的快速升级

Kubernetes 1.13.0已经正式发布,快速升级(含国内镜像快速下载链接)包括升级kubeadm/kubectl/kubelet版本、拉取镜像、升级Kubernetes集群三个主要步骤。注意Kubernetes 1.13.0版本暂时不支...

openthings
20分钟前
2
0
go的卸载和环境变量配个人.bashrc

若是用安装包直接解压 http://download.csdn.net/detail/u010026901/7592581 cd /usr/local tar -zxvf go1.1.2.linux-386.tar.gz(先把安装包移到这个目录) 3.安装 $ cd go/src,$ ./all.b......

dragon_tech
26分钟前
1
0
区块链安全 - 以太坊短地址攻击

1 基础知识 EVM虚拟机在解析合约的字节码时,依赖的是ABI的定义,从而去识别各个字段位于字节码的什么地方。关于ABI,可以阅读这个文档: https://github.com/ethereum/wiki/wiki/Ethereum-C...

HiBlock
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部