Golang 递归访问目录与函数修改数组的问题

我想写一个这样的函数:
访问一个目录下的所有*.db文件。并放入filepath[]中。filepath是一个结构体:

type filepath struct {
    fullpath string   //文件路径名
    filename string //文件名
}

写完了的程序是这个样子的,打印时:

package main

import (
    "io/ioutil"
    "strings"
    "path"
)

const rootpath string = "D://testfile/2345"

type filepath struct {
    fullpath string
    filename string
}

func main() {
    var files []filepath
    files = make([]filepath, 0, 1)
    //dir,_:=ioutil.ReadDir(rootpath)
    //递了个归
    readdir(rootpath, files)
    for _, v := range files {
        println(v.filename, v.fullpath)
    }
}

func readdir(dirs string, files []filepath) {

    dir, _ := ioutil.ReadDir(dirs)
    for _, v := range dir {
        if v.IsDir() {
            dir2 := path.Join(dirs, v.Name())
            readdir(dir2, files)
        } else {
            if strings.HasSuffix(v.Name(), ".db") {
                var str string = v.Name()
                files = append(files, filepath{fullpath: path.Join(dirs, str), filename: str})
            }
        }
    }
}
//输出:

(什么~~都没有 一脸懵b.jpg)```
像我这种JB型boy(脚本型语言boy)不常用指针就会有这种错误。加点信息调试下?

//把最后一个else 里加两句,变成下面的:
else {
if strings.HasSuffix(v.Name(), ".db") {
str := v.Name()
println("老地址", files)
files = append(files, filepath{fullpath: path.Join(dirs, str), filename: str})
println("新地址", files)
//println(len(files) )
}
//输出如下(一对一对看还是很方便 []里的数字含义为 [len/cap]):
老地址 [0/1]0xc042033f58
新地址 [1/1]0xc042033f58
老地址 [1/1]0xc042033f58
新地址 [2/2]0xc042054b00
老地址 [2/2]0xc042054b00
新地址 [3/4]0xc042066b00
老地址 [3/4]0xc042066b00
新地址 [4/4]0xc042066b00
老地址 [4/4]0xc042066b00
新地址 [5/8]0xc042036300
老地址 [5/8]0xc042036300
新地址 [6/8]0xc042036300
老地址 [6/8]0xc042036300
新地址 [7/8]0xc042036300
老地址 [7/8]0xc042036300
新地址 [8/8]0xc042036300


分析下,按照append的尿性,每次内存不够就添加 len的空间,会不会生成一段时的内存,重新分配给指针???
**先确认下会不会分配吧!!!!**
一共是八个append
1. 只有一个空间,正好 
1. 空间不够了,加 len   现在2个了
1. 空间又不够了 ,加len 现在4个了
1. 够 
1. 不够 加len 8个
1. 够
1. 够 
1. 够

内存指针变了3次,那么,就可以肯定,一开始的files = make([]filepath, 0, 1) 应该有第一组数据啊~
再打印下内存,println换下位置

func main() {
var files []filepath
files = make([]filepath, 0, 1)
//dir,_:=ioutil.ReadDir(rootpath)
//递了个归
println("老地址", files)
readdir(rootpath, files)
for _, v := range files {
println(v.filename, v.fullpath)
}
}

func readdir(dirs string, files []filepath) {
println("新地址", files)
dir, _ := ioutil.ReadDir(dirs)
for _, v := range dir {
if v.IsDir() {
dir2 := path.Join(dirs, v.Name())
readdir(dir2, files)
} else {
if strings.HasSuffix(v.Name(), ".db") {
str := v.Name()
files = append(files, filepath{fullpath: path.Join(dirs, str), filename: str})
//println(len(files) )
}
}
}
}
//打印信息如下:
老地址 [0/1]0xc042033f58
新地址 [0/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58
新地址 [1/1]0xc042033f58

我发现,头指针依旧是那个头指针,所以结论:
** 随着append增加,头指针依旧是那个头指针**
那么问题来了,为什么就是打印不出来!!!
难道,append有坑,加的东西没有给上?
写个小程序试试吧。

package main

func main() {
var p1 []int=[]int{1,2,3,4,5}
change(p1)
println(p1[5])
}
func change(p1 []int) {
p1=append(p1,2222)
}
//输出
panic :数组越界

此时,我真的是。。。。
我突然想到了什么东西!!!!
** 突然明白过来,p1是个切片, main中的p1始终指向 {1,2,3,4,5} 而不会指向{1,2,3,4,5,2222 }**
程序修改如下:

package main

func main() {
var p1 []int=[]int{1,2,3,4,5}
change2(&p1)
println(p1[5])
}
func change2(p1 *[]int) {
p1=append(p1,2222)
}
//输出: 2222

到这里,我又有了一想到了前面近乎完美的调试信息,就是这一段:
> 分析下,按照append的尿性,每次内存不够就添加 len的空间,会不会生成一段时的内存,重新分配给指针???
**先确认下会不会分配吧!!!!**
一共是八个append
1. 只有一个空间,正好 
1. 空间不够了,加 len   现在2个了
1. 空间又不够了 ,加len 现在4个了
1. 够 
1. 不够 加len 8个
1. 够
1. 够 
1. 够

我猜,99.9%的可能是   `一个文件夹中有8个.db文件`  我去看了一下,还真是。
我想到了两种解决方案:
1. 像上面的函数那样改指针(去TMD)
2. 返回一个新的切片

最后我选2,别人看起来也方便点,于是,整个程序就变成:

package main

import (
"io/ioutil"
"strings"
"path"
)

const rootpath string = "D://testfile/2345"

type filepath struct {
fullpath string
filename string
}

func main() {
var files []filepath
files = make([]filepath, 0, 1)
files= readdir(rootpath, files)
for _, v := range files {
println(v.filename, v.fullpath)
}
}

func readdir(dirs string, files []filepath) []filepath {
dir, _ := ioutil.ReadDir(dirs)
for _, v := range dir {
if v.IsDir() {
dir2 := path.Join(dirs, v.Name())
files=readdir(dir2, files)
} else {
if strings.HasSuffix(v.Name(), ".db") {
str := v.Name()
files = append(files, filepath{fullpath: path.Join(dirs, str), filename: str})
//println(len(files) )
}
}
}
return files
}

再说一下go 的 path吧,感觉功能有点少,并没有 go.getpath这个功能,只能自己手动记录文件路径。
唉,程序算是写完了吧,如果我上面写得有什么问题,希望大家指正。






最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容