├── README.md
├── l_file
├── .idea
│ ├── l_file.iml
│ ├── modules.xml
│ └── workspace.xml
├── ab.txt
├── bb.txt
├── demo01_fileinfo.go
├── demo02_file.go
├── demo03_read.go
├── demo04_write.go
├── demo05_copy.go
├── demo06_seek.go
├── demo07_seek.go
├── demo08_bufio_r.go
├── demo09_bufio_w.go
├── demo10_ioutil.go
├── demo11.go
└── guliang.jpeg
└── l_package
├── .idea
├── l_package.iml
├── modules.xml
└── workspace.xml
├── l_package
├── main.go
├── person
└── person.go
├── pk1
└── test2.go
├── pk2
└── test3.go
├── timedemo.go
└── utils
├── timeutils
└── timeutil.go
├── util.go
└── ytest1.go
/README.md:
--------------------------------------------------------------------------------
1 | # 视频列表:
2 |
3 | ## 1.《2019千锋GO语言超详细入门教程(笔记+课件+源码)》
4 |
5 | B站:https://www.bilibili.com/video/av47467197
6 |
7 | 腾讯课堂:https://ke.qq.com/course/390424
8 |
9 | 优酷/土豆:https://v.youku.com/v_show/id_XNDExMzkzMTkxMg==.html
10 |
11 | 千锋视频站:http://video.mobiletrain.org/course/index/courseId/548
12 |
13 | 爱奇艺:
14 |
15 | 56/搜狐:https://my.tv.sohu.com/pl/9541885/index.shtml
16 |
17 | 视频代码github地址:https://github.com/rubyhan1314/go_foundation
18 |
19 |
20 |
21 | ## 2.《2019Golang基础进阶实战编程》(学完基础必看)
22 |
23 | B站:https://www.bilibili.com/video/av56945376
24 |
25 | https://www.bilibili.com/video/av56860636
26 |
27 | 腾讯课堂:https://ke.qq.com/course/419109
28 |
29 | 网易云课堂:https://study.163.com/course/introduction/1209407865.htm
30 |
31 | 千锋视频站:http://video.mobiletrain.org/course/index/courseId/631
32 |
33 |
34 |
35 |
36 |
37 | ## 3.《Goweb开发之Iris框架实战【2019千锋】》
38 |
39 | B站:https://www.bilibili.com/video/av50575135
40 |
41 | 腾讯课堂:https://ke.qq.com/course/398502
42 |
43 | 优酷/土豆:https://v.youku.com/v_show/id_XNDExMzkzMTkxMg==.html
44 |
45 | 千锋视频站:http://video.mobiletrain.org/course/index/courseId/548
46 |
47 | 网易云课堂:https://study.163.com/course/introduction/1209344880.htm
48 |
49 |
50 |
51 | ## 4.《Goweb开发之Beego框架实战【2019千锋】》
52 |
53 | bilibili:https://www.bilibili.com/video/av54075956
54 | 网易云课堂:https://study.163.com/course/introduction/1209344880.htm
55 | 腾讯课堂:https://ke.qq.com/course/411509
56 |
57 |
58 |
59 | ## 5.微服务
60 |
61 | Go语言微服务从入门到大师【2019千锋】
62 | https://ke.qq.com/course/425236
63 |
64 |
65 |
66 | ## 6.《3天精通Go密码学开发实战【2019千锋】》
67 |
68 | 网易云课堂: https://study.163.com/course/introduction/1209330836.htm
69 |
70 | bilibili : https://www.bilibili.com/video/av50557831
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | # 相关资料
79 |
80 | ## 1.Go语言网站
81 |
82 | https://www.qfgolang.com/
83 |
84 |
85 |
86 | ## 2.github:Golang - 100天从新手到大师
87 |
88 | https://github.com/rubyhan1314/Golang-100-Days
89 |
90 |
91 |
92 | ## 3.知乎
93 |
94 | 知乎:茹姐
95 | 主页:https://www.zhihu.com/people/18511154519/activities
96 |
97 | 知乎:Davie
98 |
99 | 主页:https://www.zhihu.com/people/davie-81-7/activities
100 |
101 | 知乎专栏:https://zhuanlan.zhihu.com/qfgolang
102 |
103 |
104 |
105 | CSDN:千锋教育官方博客
106 | 主页:https://blog.csdn.net/GUDUzhongliang
107 |
108 |
109 |
110 | ## 4.个人博客
111 |
112 | 韩茹:
113 |
114 | 个人博客:https://rubyhan.cn/
115 |
116 | B站:https://space.bilibili.com/353694001
117 |
118 | Davie:
119 |
120 | 个人博客:https://www.davieyu.cn/
121 |
122 | B站:https://space.bilibili.com/408228716
123 |
124 |
125 |
126 |
127 |
128 | ## 5. QQ群
129 |
130 | 千锋Go学习营:784190273
131 |
132 | 千锋go语言官方①群:816085262
133 |
134 | go语言学习:376076305
135 |
136 | 
137 |
138 |
--------------------------------------------------------------------------------
/l_file/.idea/l_file.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/l_file/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/l_file/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | true
62 | DEFINITION_ORDER
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
--------------------------------------------------------------------------------
/l_file/ab.txt:
--------------------------------------------------------------------------------
1 | abcdefghij
--------------------------------------------------------------------------------
/l_file/bb.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rubyhan1314/go_advanced/071a8b60589e93253a14f05bdc1487576883b09d/l_file/bb.txt
--------------------------------------------------------------------------------
/l_file/demo01_fileinfo.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 | "fmt"
6 | )
7 |
8 | func main() {
9 | /*
10 | FileInfo:文件信息
11 | interface
12 | Name(),文件名
13 | Size(),文件大小,字节为单位
14 | IsDir(),是否是目录
15 | ModTime(),修改时间
16 | Mode(),权限
17 |
18 | */
19 | fileInfo,err := os.Stat("/Users/ruby/Documents/pro/a/aa.txt")
20 | if err != nil{
21 | fmt.Println("err :",err)
22 | return
23 | }
24 | fmt.Printf("%T\n",fileInfo)
25 | //文件名
26 | fmt.Println(fileInfo.Name())
27 | //文件大小
28 | fmt.Println(fileInfo.Size())
29 | //是否是目录
30 | fmt.Println(fileInfo.IsDir()) //IsDirectory
31 | //修改时间
32 | fmt.Println(fileInfo.ModTime())
33 | //权限
34 | fmt.Println(fileInfo.Mode()) //-rw-r--r--
35 | }
36 |
--------------------------------------------------------------------------------
/l_file/demo02_file.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "path/filepath"
6 | "path"
7 | "os"
8 | )
9 |
10 | func main() {
11 | /*
12 | 文件操作:
13 | 1.路径:
14 | 相对路径:relative
15 | ab.txt
16 | 相对于当前工程
17 | 绝对路径:absolute
18 | /Users/ruby/Documents/pro/a/aa.txt
19 |
20 | .当前目录
21 | ..上一层
22 | 2.创建文件夹,如果文件夹存在,创建失败
23 | os.MkDir(),创建一层
24 | os.MkDirAll(),可以创建多层
25 |
26 | 3.创建文件,Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)
27 | os.Create(),创建文件
28 |
29 | 4.打开文件:让当前的程序,和指定的文件之间建立一个连接
30 | os.Open(filename)
31 | os.OpenFile(filename,mode,perm)
32 |
33 | 5.关闭文件:程序和文件之间的链接断开。
34 | file.Close()
35 |
36 | 5.删除文件或目录:慎用,慎用,再慎用
37 | os.Remove(),删除文件和空目录
38 | os.RemoveAll(),删除所有
39 | */
40 | //1.路径
41 | fileName1:="/Users/ruby/Documents/pro/a/aa.txt"
42 | fileName2:="bb.txt"
43 | fmt.Println(filepath.IsAbs(fileName1)) //true
44 | fmt.Println(filepath.IsAbs(fileName2)) //false
45 | fmt.Println(filepath.Abs(fileName1))
46 | fmt.Println(filepath.Abs(fileName2)) // /Users/ruby/go/src/l_file/bb.txt
47 |
48 | fmt.Println("获取父目录:",path.Join(fileName1,".."))
49 |
50 | //2.创建目录
51 | //err := os.Mkdir("/Users/ruby/Documents/pro/a/bb",os.ModePerm)
52 | //if err != nil{
53 | // fmt.Println("err:",err)
54 | // return
55 | //}
56 | //fmt.Println("文件夹创建成功。。")
57 | //err :=os.MkdirAll("/Users/ruby/Documents/pro/a/cc/dd/ee",os.ModePerm)
58 | //if err != nil{
59 | // fmt.Println("err:",err)
60 | // return
61 | //}
62 | //fmt.Println("多层文件夹创建成功")
63 |
64 | //3.创建文件:Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)
65 | //file1,err :=os.Create("/Users/ruby/Documents/pro/a/ab.txt")
66 | //if err != nil{
67 | // fmt.Println("err:",err)
68 | // return
69 | //}
70 | //fmt.Println(file1)
71 |
72 | //file2,err := os.Create(fileName2)//创建相对路径的文件,是以当前工程为参照的
73 | //if err != nil{
74 | // fmt.Println("err :",err)
75 | // return
76 | //}
77 | //fmt.Println(file2)
78 |
79 | //4.打开文件:
80 | //file3 ,err := os.Open(fileName1) //只读的
81 | //if err != nil{
82 | // fmt.Println("err:",err)
83 | // return
84 | //}
85 | //fmt.Println(file3)
86 | /*
87 | 第一个参数:文件名称
88 | 第二个参数:文件的打开方式
89 | const (
90 | // Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
91 | O_RDONLY int = syscall.O_RDONLY // open the file read-only.
92 | O_WRONLY int = syscall.O_WRONLY // open the file write-only.
93 | O_RDWR int = syscall.O_RDWR // open the file read-write.
94 | // The remaining values may be or'ed in to control behavior.
95 | O_APPEND int = syscall.O_APPEND // append data to the file when writing.
96 | O_CREATE int = syscall.O_CREAT // create a new file if none exists.
97 | O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist.
98 | O_SYNC int = syscall.O_SYNC // open for synchronous I/O.
99 | O_TRUNC int = syscall.O_TRUNC // truncate regular writable file when opened.
100 | )
101 | 第三个参数:文件的权限:文件不存在创建文件,需要指定权限
102 | */
103 | //file4,err := os.OpenFile(fileName1,os.O_RDONLY|os.O_WRONLY,os.ModePerm)
104 | //if err != nil{
105 | // fmt.Println("err:",err)
106 | // return
107 | //}
108 | //fmt.Println(file4)
109 |
110 | //5关闭文件,
111 | //file4.Close()
112 |
113 | //6.删除文件或文件夹:
114 | //删除文件
115 | //err := os.Remove("/Users/ruby/Documents/pro/a/aa.txt")
116 | //if err != nil{
117 | // fmt.Println("err:",err)
118 | // return
119 | //}
120 | //fmt.Println("删除文件成功。。")
121 | //删除目录
122 | err := os.RemoveAll("/Users/ruby/Documents/pro/a/cc")
123 | if err != nil{
124 | fmt.Println("err:",err)
125 | return
126 | }
127 | fmt.Println("删除目录成功。。")
128 | }
129 |
--------------------------------------------------------------------------------
/l_file/demo03_read.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 | "fmt"
6 | "io"
7 | )
8 |
9 | func main() {
10 | /*
11 | 读取数据:
12 | Reader接口:
13 | Read(p []byte)(n int, error)
14 | */
15 | //读取本地aa.txt文件中的数据
16 | //step1:打开文件
17 | fileName := "/Users/ruby/Documents/pro/a/aa.txt"
18 | file,err := os.Open(fileName)
19 | if err != nil{
20 | fmt.Println("err:",err)
21 | return
22 | }
23 | //step3:关闭文件
24 | defer file.Close()
25 |
26 | //step2:读取数据
27 | bs := make([]byte,4,4)
28 | /*
29 | //第一次读取
30 | n,err :=file.Read(bs)
31 | fmt.Println(err) //
32 | fmt.Println(n) //4
33 | fmt.Println(bs) //[97 98 99 100]
34 | fmt.Println(string(bs)) //abcd
35 |
36 | //第二次读取
37 | n,err = file.Read(bs)
38 | fmt.Println(err)//
39 | fmt.Println(n)//4
40 | fmt.Println(bs) //[101 102 103 104]
41 | fmt.Println(string(bs)) //efgh
42 |
43 | //第三次读取
44 | n,err = file.Read(bs)
45 | fmt.Println(err) //
46 | fmt.Println(n) //2
47 | fmt.Println(bs) //[105 106 103 104]
48 | fmt.Println(string(bs)) //ijgh
49 |
50 | //第四次读取
51 | n,err = file.Read(bs)
52 | fmt.Println(err) //EOF
53 | fmt.Println(n) //0
54 | */
55 | n := -1
56 | for{
57 | n,err = file.Read(bs)
58 | if n == 0 || err == io.EOF{
59 | fmt.Println("读取到了文件的末尾,结束读取操作。。")
60 | break
61 | }
62 | fmt.Println(string(bs[:n]))
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/l_file/demo04_write.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 | "fmt"
6 | "log"
7 | )
8 |
9 | func main() {
10 | /*
11 | 写出数据:
12 | */
13 |
14 | fileName := "/Users/ruby/Documents/pro/a/ab.txt"
15 | //step1:打开文件
16 | //step2:写出数据
17 | //step3:关闭文件
18 | //file,err := os.Open(fileName)
19 | file,err := os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,os.ModePerm)
20 | if err != nil{
21 | fmt.Println(err)
22 | return
23 | }
24 | defer file.Close()
25 |
26 | //写出数据
27 | //bs :=[]byte{65,66,67,68,69,70}//A,B,C,D,E,F
28 | bs :=[] byte{97,98,99,100} //a,b,c,d
29 | //n,err := file.Write(bs)
30 | n,err := file.Write(bs[:2])
31 | fmt.Println(n)
32 | HandleErr(err)
33 | file.WriteString("\n")
34 |
35 | //直接写出字符串
36 | n,err = file.WriteString("HelloWorld")
37 | fmt.Println(n)
38 | HandleErr(err)
39 |
40 | file.WriteString("\n")
41 | n,err =file.Write([]byte("today"))
42 | fmt.Println(n)
43 | HandleErr(err)
44 |
45 | }
46 |
47 | func HandleErr(err error){
48 | if err != nil{
49 | log.Fatal(err)
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/l_file/demo05_copy.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 | "io"
6 | "fmt"
7 | "io/ioutil"
8 | )
9 |
10 | func main() {
11 | /*
12 | 拷贝文件:
13 | */
14 | srcFile := "/Users/ruby/Documents/pro/a/guliang.jpeg"
15 | destFile := "guliang3.jpeg"
16 | //total,err := CopyFile1(srcFile,destFile)
17 | //total,err := CopyFile2(srcFile,destFile)
18 | total,err := CopyFile3(srcFile,destFile)
19 | fmt.Println(total,err)
20 | }
21 |
22 | func CopyFile3(srcFile,destFile string)(int,error){
23 | bs,err := ioutil.ReadFile(srcFile)
24 | if err != nil{
25 | return 0,err
26 | }
27 | err = ioutil.WriteFile(destFile,bs,0777)
28 | if err != nil{
29 | return 0,err
30 | }
31 | return len(bs),nil
32 | }
33 |
34 | func CopyFile2(srcFile,destFile string)(int64,error){
35 | file1,err := os.Open(srcFile)
36 | if err != nil{
37 | return 0,err
38 | }
39 | file2,err := os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm)
40 | if err != nil{
41 | return 0,err
42 | }
43 | defer file1.Close()
44 | defer file2.Close()
45 | return io.Copy(file2,file1)
46 | }
47 |
48 |
49 | //该函数:用于通过io操作实现文件的拷贝,返回值是拷贝的总数量(字节),错误
50 | func CopyFile1(srcFile,destFile string)(int,error){
51 | file1,err :=os.Open(srcFile)
52 | if err != nil{
53 | return 0,err
54 | }
55 | file2,err := os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm)
56 | if err != nil{
57 | return 0,err
58 | }
59 | defer file1.Close()
60 | defer file2.Close()
61 |
62 | //读写
63 | bs := make([]byte,1024,1024)
64 | n := -1 //读取的数据量
65 | total := 0
66 | for{
67 | n,err = file1.Read(bs)
68 | if err == io.EOF || n==0{
69 | fmt.Println("拷贝完毕。。")
70 | break
71 | }else if err != nil{
72 | fmt.Println("报错了。。")
73 | return total,err
74 | }
75 | total += n
76 | file2.Write(bs[:n])
77 | }
78 | return total,nil
79 | }
80 |
81 |
--------------------------------------------------------------------------------
/l_file/demo06_seek.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 | "log"
6 | "fmt"
7 | "io"
8 | )
9 |
10 | func main() {
11 | /*
12 | Seek(offset int64, whence int) (int64, error),设置指针光标的位置
13 | 第一个参数:偏移量
14 | 第二个参数:如何设置
15 | 0:seekstart,表示相对于文件开始
16 | 1:seekcurrent,表示相对于当前位置的偏移量
17 | 2:seekend,表示相对于末尾
18 |
19 |
20 | // Seek whence values.
21 | const (
22 | SeekStart = 0 // seek relative to the origin of the file
23 | SeekCurrent = 1 // seek relative to the current offset
24 | SeekEnd = 2 // seek relative to the end
25 | )
26 | */
27 | fileName := "/Users/ruby/Documents/pro/a/aa.txt"
28 | file,err := os.OpenFile(fileName,os.O_RDWR,os.ModePerm)
29 | if err != nil{
30 | log.Fatal(err)
31 | }
32 | defer file.Close()
33 | //读写
34 | bs :=[]byte{0}
35 | file.Read(bs)
36 | fmt.Println(string(bs))
37 |
38 | file.Seek(4,io.SeekStart)
39 | file.Read(bs)
40 | fmt.Println(string(bs))
41 |
42 | file.Seek(2,0) //SeekStart
43 | file.Read(bs)
44 | fmt.Println(string(bs))
45 |
46 | file.Seek(3,io.SeekCurrent)
47 | file.Read(bs)
48 | fmt.Println(string(bs))
49 |
50 | file.Seek(0,io.SeekEnd)
51 | file.WriteString("ABC")
52 | }
53 |
--------------------------------------------------------------------------------
/l_file/demo07_seek.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "strings"
5 | "fmt"
6 | "os"
7 | "log"
8 | "io"
9 | "strconv"
10 | )
11 |
12 | func main() {
13 | /*
14 | 断点续传:
15 | 文件传递:文件复制
16 |
17 | "/Users/ruby/Documents/pro/a/guliang.jpeg"
18 |
19 | 复制到当前的工程下:
20 |
21 | 思路:边复制,边记录复制的总量
22 |
23 | */
24 | srcFile := "/Users/ruby/Documents/pro/a/guliang.jpeg"
25 | destFile := srcFile[strings.LastIndex(srcFile,"/")+1:]
26 | fmt.Println(destFile)
27 | tempFile := destFile+"temp.txt"
28 | fmt.Println(tempFile)
29 |
30 | file1,err := os.Open(srcFile)
31 | HandleErr(err)
32 | file2,err := os.OpenFile(destFile,os.O_CREATE|os.O_WRONLY,os.ModePerm)
33 | HandleErr(err)
34 | file3,err := os.OpenFile(tempFile,os.O_CREATE|os.O_RDWR,os.ModePerm)
35 | HandleErr(err)
36 |
37 | defer file1.Close()
38 | defer file2.Close()
39 |
40 | //step1:先读取临时文件中的数据,再seek
41 | file3.Seek(0,io.SeekStart)
42 | bs := make([]byte,100,100)
43 | n1,err := file3.Read(bs)
44 | //HandleErr(err)
45 | countStr := string(bs[:n1])
46 | count,err := strconv.ParseInt(countStr,10,64)
47 | //HandleErr(err)
48 | fmt.Println(count)
49 |
50 |
51 | //step2:设置读,写的位置:
52 | file1.Seek(count,io.SeekStart)
53 | file2.Seek(count,io.SeekStart)
54 | data := make([]byte,1024,1024)
55 | n2 := -1 //读取的数据量
56 | n3 := -1 //写出的数据量
57 | total := int(count) //读取的总量
58 |
59 | //step3:复制文件
60 | for{
61 | n2,err =file1.Read(data)
62 | if err == io.EOF || n2 == 0{
63 | fmt.Println("文件复制完毕。。",total)
64 | file3.Close()
65 | os.Remove(tempFile)
66 | break
67 | }
68 | n3,err = file2.Write(data[:n2])
69 | total += n3
70 |
71 | //将复制的总量,存储到临时文件中
72 | file3.Seek(0,io.SeekStart)
73 | file3.WriteString(strconv.Itoa(total))
74 |
75 | fmt.Printf("total:%d\n",total)
76 |
77 | //假装断电
78 | //if total > 8000{
79 | // panic("假装断电了。。。")
80 | //}
81 |
82 |
83 | }
84 |
85 |
86 |
87 | }
88 |
89 | func HandleErr(err error){
90 | if err != nil{
91 | log.Fatal(err)
92 | }
93 | }
--------------------------------------------------------------------------------
/l_file/demo08_bufio_r.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 | "fmt"
6 | "bufio"
7 | )
8 |
9 | func main() {
10 | /*
11 | bufio:高效io读写
12 | buffer缓存
13 | io:input/output
14 |
15 | 将io包下的Reader,Write对象进行包装,带缓存的包装,提高读写的效率
16 |
17 | ReadBytes()
18 | ReadString()
19 | ReadLine()
20 |
21 | */
22 |
23 | fileName:="/Users/ruby/Documents/pro/a/english.txt"
24 | file,err := os.Open(fileName)
25 | if err != nil{
26 | fmt.Println(err)
27 | return
28 | }
29 | defer file.Close()
30 |
31 | //创建Reader对象
32 | //b1 := bufio.NewReader(file)
33 | //1.Read(),高效读取
34 | //p := make([]byte,1024)
35 | //n1,err := b1.Read(p)
36 | //fmt.Println(n1)
37 | //fmt.Println(string(p[:n1]))
38 |
39 | //2.ReadLine()
40 | //data,flag,err := b1.ReadLine()
41 | //fmt.Println(flag)
42 | //fmt.Println(err)
43 | //fmt.Println(data)
44 | //fmt.Println(string(data))
45 |
46 | //3.ReadString()
47 | // s1,err :=b1.ReadString('\n')
48 | // fmt.Println(err)
49 | // fmt.Println(s1)
50 | //
51 | // s1,err = b1.ReadString('\n')
52 | // fmt.Println(err)
53 | // fmt.Println(s1)
54 | //
55 | //s1,err = b1.ReadString('\n')
56 | //fmt.Println(err)
57 | //fmt.Println(s1)
58 | //
59 | //for{
60 | // s1,err := b1.ReadString('\n')
61 | // if err == io.EOF{
62 | // fmt.Println("读取完毕。。")
63 | // break
64 | // }
65 | // fmt.Println(s1)
66 | //}
67 |
68 | //4.ReadBytes()
69 | //data,err :=b1.ReadBytes('\n')
70 | //fmt.Println(err)
71 | //fmt.Println(string(data))
72 |
73 |
74 | //Scanner
75 | //s2 := ""
76 | //fmt.Scanln(&s2)
77 | //fmt.Println(s2)
78 |
79 | b2 := bufio.NewReader(os.Stdin)
80 | s2, _ := b2.ReadString('\n')
81 | fmt.Println(s2)
82 |
83 | }
84 |
--------------------------------------------------------------------------------
/l_file/demo09_bufio_w.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 | "fmt"
6 | "bufio"
7 | )
8 |
9 | func main() {
10 | /*
11 | bufio:高效io读写
12 | buffer缓存
13 | io:input/output
14 |
15 | 将io包下的Reader,Write对象进行包装,带缓存的包装,提高读写的效率
16 |
17 | func (b *Writer) Write(p []byte) (nn int, err error)
18 | func (b *Writer) WriteByte(c byte) error
19 | func (b *Writer) WriteRune(r rune) (size int, err error)
20 | func (b *Writer) WriteString(s string) (int, error)
21 |
22 | */
23 |
24 | fileName := "/Users/ruby/Documents/pro/a/cc.txt"
25 | file,err := os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY,os.ModePerm)
26 | if err != nil{
27 | fmt.Println(err)
28 | return
29 | }
30 | defer file.Close()
31 |
32 | w1 := bufio.NewWriter(file)
33 | //n,err := w1.WriteString("helloworld")
34 | //fmt.Println(err)
35 | //fmt.Println(n)
36 | //w1.Flush() //刷新缓冲区
37 |
38 | for i:=1;i<=1000;i++{
39 | w1.WriteString(fmt.Sprintf("%d:hello",i))
40 | }
41 | w1.Flush()
42 | }
43 |
--------------------------------------------------------------------------------
/l_file/demo10_ioutil.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "io/ioutil"
5 | "fmt"
6 | "os"
7 | )
8 |
9 | func main() {
10 | /*
11 | ioutil包:
12 | ReadFile()
13 | WriteFile()
14 | ReadDir()
15 | ..
16 | */
17 |
18 | //1.读取文件中的所有的数据
19 | // fileName := "/Users/ruby/Documents/pro/a/aa.txt"
20 | //data,err := ioutil.ReadFile(fileName)
21 | //fmt.Println(err)
22 | //fmt.Println(data)
23 | //fmt.Println(string(data))
24 |
25 | //2.写出数据
26 | //fileName := "/Users/ruby/Documents/pro/a/bbb.txt"
27 | //s1 := "床前明月光,地上鞋三双"
28 | //err := ioutil.WriteFile(fileName,[]byte(s1),os.ModePerm)
29 | //fmt.Println(err)
30 |
31 | //3.ReadAll()
32 | //s2 := "王二狗和李小花是两个好朋友,Ruby就是我,也是他们的朋友"
33 | //r1:=strings.NewReader(s2)
34 | //data,err :=ioutil.ReadAll(r1)
35 | //fmt.Println(err)
36 | //fmt.Println(data)
37 | //fmt.Println(string(data))
38 |
39 | //4.ReadDir(),读取一个目录下的子内容:子文件和子目录,但是只能读取一层
40 | //dirName := "/Users/ruby/Documents/pro"
41 | //fileInfos,err := ioutil.ReadDir(dirName)
42 | //if err != nil{
43 | // fmt.Println(err)
44 | // return
45 | //}
46 | //fmt.Println(len(fileInfos))
47 | //for i:=0;i
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/l_package/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/l_package/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | true
57 | DEFINITION_ORDER
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
--------------------------------------------------------------------------------
/l_package/l_package:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rubyhan1314/go_advanced/071a8b60589e93253a14f05bdc1487576883b09d/l_package/l_package
--------------------------------------------------------------------------------
/l_package/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | _ "l_package/pk1"
5 |
6 | //"database/sql"
7 | //_ "github.com/go-sql-driver/mysql"
8 | //"fmt"
9 | "l_package/pk2"
10 | )
11 |
12 | //import "l_package/utils" //绝对路径
13 |
14 | //import "./utils" //相对路径
15 | //
16 | //import (
17 | // "l_package/utils/timeutils"
18 | // "l_package/pk1"
19 | // "fmt"
20 | // p "l_package/person"
21 | //)
22 | func main() {
23 | /*
24 | 关于包的使用:
25 | 1.一个目录下的统计文件归属一个包。package的声明要一致
26 | 2.package声明的包和对应的目录名可以不一致。但习惯上还是写成一致的
27 | 3.包可以嵌套
28 | 4.同包下的函数不需要导入包,可以直接使用
29 | 5.main包,main()函数所在的包,其他的包不能使用
30 | 6.导入包的时候,路径要从src下开始写
31 | */
32 | //utils.Count()
33 | //timeutils.PrintTime()
34 | //
35 | //pk1.MyTest1()
36 | //
37 | //utils.MyTest2()
38 | //
39 | //fmt.Println("---------------------")
40 | //p1 :=p.Person{Name:"王二狗",Sex:"男"}
41 | //fmt.Println(p1.Name,p1.Sex)
42 |
43 |
44 | /*
45 | init()函数和main()函数
46 | 1.这两个函数都是go语言中的保留函数。init()用于初始化信息,main()用于作为程序的入口
47 | 2.这两个函数定义的时候:不能有参数,返回值。只能由go程序自动调用,不能被引用。
48 | 3.init()函数可以定义在任意的包中,可以有多个。main()函数只能在main包下,并且只能有一个。
49 | 4.执行顺序
50 | A:先执行init()函数,后执行main()函数
51 | B:对于同一个go文件中,调用顺序是从上到下的,也就是说,先写的先被执行,后写的后被执行
52 | C:对于同一个包下,将文件名按照字符串进行排序,之后顺序调用各个文件中init()函数
53 | D:对于不同包下,
54 | 如果不存在依赖,按照main包中import的顺序来调用对应包中init()函数
55 | 如果存在依赖,最后被依赖的最先被初始化
56 | 导入顺序:main-->A-->B-->C
57 | 执行顺序:C-->B-->A-->main
58 |
59 | 5.存在依赖的包之间,不能循环导入
60 | 6.一个包可以被其他多个包import,但是只能被初始化一次。
61 | 7._操作,其实是引入该包,而不直接使用包里面的函数,仅仅是调用了该包里的init()
62 | */
63 | //utils.Count()
64 |
65 | //pk1.MyTest1()
66 |
67 | //database/sql
68 |
69 | //db,err :=sql.Open("mysql","root:hanru1314@tcp(127.0.0.1:3306)/my1802?charset=utf8")
70 | //if err != nil{
71 | // fmt.Println("错误信息:",err)
72 | // return
73 | //}
74 | //fmt.Println("链接成功:",db)
75 |
76 | pk2.MyTest3()
77 | }
78 |
--------------------------------------------------------------------------------
/l_package/person/person.go:
--------------------------------------------------------------------------------
1 | package person
2 |
3 | type Person struct {
4 | Name string
5 | age int
6 | Sex string
7 | }
8 |
--------------------------------------------------------------------------------
/l_package/pk1/test2.go:
--------------------------------------------------------------------------------
1 | package pk1
2 |
3 | import (
4 |
5 | "fmt"
6 |
7 | )
8 |
9 | func MyTest1(){
10 | //utils.Count()
11 | //timeutils.PrintTime()
12 | fmt.Println("pk1包下的MyTest1()函数。。。。")
13 | }
14 |
15 | func init(){
16 | fmt.Println("pk1包下的init()函数。。。")
17 | }
--------------------------------------------------------------------------------
/l_package/pk2/test3.go:
--------------------------------------------------------------------------------
1 | package pk2
2 |
3 | import "fmt"
4 |
5 | func MyTest3(){
6 | fmt.Println("pk2包下的MyTest3()函数。。。")
7 | }
8 |
--------------------------------------------------------------------------------
/l_package/timedemo.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "time"
5 | "fmt"
6 | "math/rand"
7 | )
8 |
9 | func main() {
10 | /*
11 | time包:
12 | 1年=365天,day
13 | 1天=24小时,hour
14 | 1小时=60分钟,minute
15 | 1分钟=60秒,second
16 | 1秒钟=1000毫秒,millisecond
17 | 1毫秒=1000微秒,microsecond-->μs
18 | 1微秒=1000纳秒,nanosecond-->ns
19 | 1纳秒=1000皮秒,picosecond-->ps
20 | */
21 |
22 | //1.获取当前的时间
23 | t1 := time.Now()
24 | fmt.Printf("%T\n",t1)
25 | fmt.Println(t1) //2019-06-26 10:46:40.349196 +0800 CST m=+0.000495846
26 |
27 | //2.获取指定的时间
28 | t2 := time.Date(2008,7,15,16,30,28,0,time.Local)
29 | fmt.Println(t2) //2008-07-15 16:30:28 +0800 CST
30 |
31 | //3.time-->string之间的转换
32 | /*
33 | t1.Format("格式模板")-->string
34 | 模板的日期必须是固定:06-1-2-3-4-5
35 | */
36 | s1 := t1.Format("2006-1-2 15:04:05")
37 | fmt.Println(s1)
38 |
39 | s2 := t1.Format("2006/01/02")
40 | fmt.Println(s2)
41 |
42 | //string-->time
43 | /*
44 | time.Parse("模板",str)-->time,err
45 | */
46 | s3 := "1999年10月10日"//string
47 | t3 ,err := time.Parse("2006年01月02日",s3)
48 | if err != nil{
49 | fmt.Println("err:",err)
50 | }
51 | fmt.Println(t3)
52 | fmt.Printf("%T\n",t3)
53 |
54 | fmt.Println(t1.String())
55 |
56 | //4.根据当前时间,获取指定的内容
57 | year,month,day := t1.Date() //年,月,日
58 | fmt.Println(year,month,day)
59 |
60 | hour,min,sec := t1.Clock()
61 | fmt.Println(hour,min,sec) //时,分,秒
62 |
63 | year2 := t1.Year()
64 | fmt.Println("年:",year2)
65 | fmt.Println(t1.YearDay())
66 |
67 | month2 := t1.Month()
68 | fmt.Println("月:",month2)
69 | fmt.Println("日:",t1.Day())
70 | fmt.Println("时:",t1.Hour())
71 | fmt.Println("分钟:",t1.Minute())
72 | fmt.Println("秒:",t1.Second())
73 | fmt.Println("纳秒:",t1.Nanosecond())
74 |
75 | fmt.Println(t1.Weekday()) //Wednesday
76 |
77 | //5.时间戳:指定的日期,距离1970年1月1日0点0时0分0秒的时间差值:秒,纳秒
78 |
79 | t4 := time.Date(1970,1,1,1,0,0,0,time.UTC)
80 | timeStamp1:=t4.Unix() //秒的差值
81 | fmt.Println(timeStamp1)
82 | timeStamp2 := t1.Unix()
83 | fmt.Println(timeStamp2)
84 |
85 | timeStamp3 := t4.UnixNano()
86 | fmt.Println(timeStamp3) //3600 000 000 000
87 | timeStamp4 := t1.UnixNano()
88 | fmt.Println(timeStamp4)
89 |
90 | //6.时间间隔
91 | t5 := t1.Add(time.Minute)
92 | fmt.Println(t1)
93 | fmt.Println(t5)
94 | fmt.Println(t1.Add(24 * time.Hour))
95 |
96 | t6 := t1.AddDate(1,0,0)
97 | fmt.Println(t6)
98 |
99 | d1 := t5.Sub(t1)
100 | fmt.Println(d1)
101 |
102 | //7.睡眠
103 | time.Sleep(3 *time.Second) //让当前的程序进入睡眠状态
104 | fmt.Println("main。。。over。。。。。")
105 |
106 | //睡眠[1-10]的随机秒数
107 | rand.Seed(time.Now().UnixNano())
108 | randNum := rand.Intn(10) + 1 //int
109 | fmt.Println(randNum)
110 | time.Sleep(time.Duration(randNum)*time.Second)
111 | fmt.Println("睡醒了。。")
112 | }
113 |
--------------------------------------------------------------------------------
/l_package/utils/timeutils/timeutil.go:
--------------------------------------------------------------------------------
1 | package timeutils
2 |
3 | import (
4 | "fmt"
5 | "time"
6 | )
7 |
8 | func PrintTime(){
9 | fmt.Println(time.Now())
10 | }
--------------------------------------------------------------------------------
/l_package/utils/util.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import "fmt"
4 |
5 | func Count(){
6 | fmt.Println("utils包下的Count()函数。。。")
7 | }
8 |
9 | func init(){
10 | fmt.Println("utils包的另一个init()函数。。")
11 | }
12 |
13 |
14 | func init(){
15 | fmt.Println("utils包的init()函数,用于初始化一些信息。。。")
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/l_package/utils/ytest1.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import "fmt"
4 |
5 | func MyTest2(){
6 | Count()
7 | }
8 |
9 | func init(){
10 | fmt.Println("utils包下的test1.go文件中的init()函数。。。")
11 | }
--------------------------------------------------------------------------------