GO語言的進階之路-Golang字符串處理以及文件操作


                   GO語言的進階之路-Golang字符串處理以及文件操作

                                                  作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

  我們都知道Golang是一門強類型的語言,相比Python在處理一些並發問題也是有過之而無不及,甚至可以說遠遠的甩python幾條街。學過python基礎或是shell的童鞋應該知道我們在定義一個變量的時候是不需要指定其所屬數據類型的,直接讓其等於一個變量即可,他們的解釋器會自動識別你定義的是個整數,浮點數,字符串,還是數組或是函數。而Golang在定義每個變量的時候都被指定了數據類型,如果你給這個變量定義的是數字類型,你把它的指針指向字符串的話就會報錯!接下來,讓我們先看看,整數,常量,字符串,運算符等基礎的數據類型吧,本文還會介紹Golang的循環控制以及文件處理等常用的操作。

   當然我這里只是介紹了Golang的冰山一角,對Golang感興趣的小伙伴,可以看一下Golang官網的文檔說明。畢竟官方才是最權威的,給出國內地址:https://golang.org/pkg/

 

一.整數

1.int與uint的初值比較以及其大小。

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 '''
 9 [root@yinzhengjie day3]# more myint.go
10 package main
11 
12 import (
13         "fmt"
14         "unsafe"
15 )
16 
17 func main()  {
18         var  (
19                 a int //包括所有的整數
20                 b int8 //取值個數2^8,取之范圍(-128)-(127)
21                 c int16
22                 d int32 //取值個數:2^32,取值范圍:(-2^16)-(2^16-1)
23                 e int64
24                 x uint  //其中這個"u",即:unsigned。表示無符號,即只能表示0和所有的正整數。
25                 y uint8
26                 z uint16
27                 p uint32 //取之個數:2^32,取之范圍0-2^32-1
28                 q uint64
29         )
30         fmt.Println("A=",a,"size=",unsafe.Sizeof(a))
31         fmt.Println("B=",b,"size=",unsafe.Sizeof(b))
32         fmt.Println("C=",c,"size=",unsafe.Sizeof(c))
33         fmt.Println("D=",d,"size=",unsafe.Sizeof(d))
34         fmt.Println("E=",e,"size=",unsafe.Sizeof(e))
35         fmt.Println("X=",x,"size=",unsafe.Sizeof(x))
36         fmt.Println("Y=",y,"size=",unsafe.Sizeof(y))
37         fmt.Println("Z=",z,"size=",unsafe.Sizeof(z))
38         fmt.Println("P=",p,"size=",unsafe.Sizeof(p))
39         fmt.Println("Q=",q,"size=",unsafe.Sizeof(q))
40 }
41 
42 [root@yinzhengjie day3]#
43 [root@yinzhengjie day3]# go run myint.go 
44 A= 0 size= 8
45 B= 0 size= 1
46 C= 0 size= 2
47 D= 0 size= 4
48 E= 0 size= 8
49 X= 0 size= 8
50 Y= 0 size= 1
51 Z= 0 size= 2
52 P= 0 size= 4
53 Q= 0 size= 8
54 [root@yinzhengjie day3]# 
55 
56 '''

 2.常量(關鍵字:const )的定義

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "fmt"
12 )
13 
14 const (  //"const"關鍵字是定義一個常量。
15     PI = 3.1415926
16     E = 2.0
17     g = 9.8
18 )
19 
20 const  (
21     RED = 10 * iota //"iota"關鍵字幫你自動從0,1,2......依次開始遞增
22     GREEN
23     BLUE
24 )
25 
26 func main()  {
27     fmt.Println(RED,GREEN,BLUE)
28     var (
29         n int
30         f float32
31         f_1 float32
32     )
33     n = 10
34     f = float32(n) / 3 //"n=10"屬於“int”類型,int是整數類型,float32是浮點數類型,兩者必須轉換成一致的,不然會報錯。因為Golang是強類型語言。這也是它的特點之一。
35     fmt.Println(f,n)
36     f_1 = float32(n / 3)  //"n / 3"的結果是"3",因為int的類型是個整數,所以被整數三除了之后應該還是整數。
37     fmt.Println(f_1)
38     fmt.Println(f_1 * 3)
39     n = int(f_1 * 3) //同左不同右,我們可以把右邊的float32類型轉換成int類型
40     fmt.Println(n)
41     var  (
42         n1 int64
43         n2 int8
44     )
45     n1 = 2222222221024004
46     n2 = int8(n1) //要注意的是int8的取值范圍是[-128到127],總共255個數字。它會從這個數組的從右往左取數字,最多也就占3位,盡管你前面有再多的數字對其都是無用的。
47     fmt.Println(n1,n2)
48 
49     n1 = 1024129
50     n2 = int8(n1) //看完上面的例子你也,你也應該明白了,在其取值范圍是會取得這個數字,如果不在的話渠道的數字也是有問題的!(數字128已經超出其正數的取值范圍,它又從-128到0這個段開始取值。)因此在轉換的時候要留心喲。
51     fmt.Println(n1,n2)
52 }
53 
54 
55 #以上代碼輸出結果如下:
56 0 10 20
57 3.3333333 10
58 3
59 9
60 9
61 2222222221024004 4
62 1024129 -127

3.關於int的取值范圍擴充。

4.將數字轉換成字符串

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "fmt"
12     "strconv"
13     "reflect"
14 )
15 
16 
17 func main()  {
18 
19     var (
20         s string
21         x = 100
22     )
23     s = strconv.Itoa(x) //將一個整數轉換成字符串的方法
24     fmt.Println("轉換前的類型",reflect.TypeOf(x))
25     fmt.Println("我是轉換后的字符串:",s)
26     fmt.Println("轉換后的類型",reflect.TypeOf(s))
27 
28 }
29 
30 
31 #以上代碼輸出結果如下:
32 轉換前的類型 int
33 我是轉換后的字符串: 100
34 轉換后的類型 string

 5.生成隨機字符串案例

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 //世界上只有10種人,一種是懂二進制,一種是不懂二進制。
 9 package main
10 
11 import (
12     "math/rand"
13     "time"
14     "strconv"
15     "fmt"
16 )
17 
18 var  x int64
19 var  s string
20 
21 func main()  {
22     rand.Seed(time.Now().Unix())
23     x = rand.Int63()
24     s = strconv.FormatInt(x,36) //表示用36進制來計算x的值。
25     fmt.Println(s) //我們可以在這里對字符串做切片操作,這樣就可以隨機獲取到我們想要到字符了。
26 }
27 
28 
29 
30 #以上代碼直接結果如下:
31 p7d8bbl6rjy4

 

二.字符串

1.字符串花式定義玩法以及注釋操作

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 '''
 9 [root@yinzhengjie day3]# more str_note.go 
10 package main
11 
12 import (
13         "fmt"
14 )
15 
16 func main()  {
17         str1 := "yinzhengjie\thave a apple!" //"\t"表示制表符,會根據操作系統自動空出幾個空格。
18         doc :=`  //定義多行注釋
19 111
20         222
21         3333
22         `
23         x := "hello\\world" //轉移用"/"
24         y := "您好,尹正傑!\a" //在終端執行電腦會響.在IDE上執行可能不會有聲音喲!
25         z := "####1\b2222" //"\b"表示退格鍵,會把"\b"前面的一個字符給刪除掉,即打印的時候會刪除數字"1"
26         fmt.Println(str1)
27         fmt.Println(doc)
28         fmt.Println(x)
29         fmt.Println(y)
30         fmt.Println(z)
31 }
32 
33 //本行是單行注釋,下面到結尾是多行注釋。
34 /*
35 I have a pen
36 I have an apple
37 I have a pen and i have an apple!
38 */
39 
40 [root@yinzhengjie day3]# 
41 [root@yinzhengjie day3]# go run str_note.go  //如果你是在終端執行的話,或者windows用crt遠程linux服務器,每次執行該腳本的時候都會出現系統提示音,前提是你的聲卡要正常!
42 yinzhengjie     have a apple!
43   //定義多行注釋
44 111
45         222
46         3333
47 
48 hello\world
49 您好,尹正傑!
50 ####2222
51 [root@yinzhengjie day3]# 
52 
53 '''

2.字符串操作

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 '''
 9 [root@yinzhengjie day3]# more str_manipulation.go 
10 package main
11 
12 
13 
14 /*
15 字符串修改:
16 1.單引號是字符,雙引號是字符串;
17 2.字符串本身不可以修改;
18 3.通過跟"[]byte"數組相互轉換來修改;
19 */
20 
21 import (
22         "fmt"
23 )
24 
25 func main()  {
26         str1 := "yinzhengjie" + "world" //拼接
27         fmt.Println(str1)
28 
29         var  str2 byte  //1個字節(byte)=8個比特位(bits),因此byte = uint8
30         str2 = str1[0] //取字符
31         fmt.Println(str2)
32         fmt.Printf("數字:%d 字符:%c\n",str2,str2) //表示字符"y"在ASCII表中對應的數字。printf不會換行但是prin
33 tln會自動換行。
34 
35         str3 := str1[0:11] //切片,顧左不顧右,取0-10共11個字符,不會去知道第12個字符,即不會取到下標為11第字符
36 "w"
37         fmt.Println(str3)
38 
39         str4 := str1[11:len(str1)]
40         fmt.Println(str4)
41 
42         var b uint8 //我們這里也可以把unit8寫成byte,其實是等效的。
43         for b = 0;b < 177 ;b++  {
44                 fmt.Printf("%d %c\n",b,b)
45         }
46         array := []byte(str1) //將字符串轉換成byte數組,可以理解成為python中的list.
47         fmt.Println(array)
48         array[0] = 72 //也可以寫字符'H',在ASCII中他們是一一對應的
49         str1 = string(array)
50         fmt.Println(str1)
51 
52         fmt.Println('a' + ('H' - 'h')) //其實就是這些字符在ASCII中的數字相加減,得到的數字為65。
53         fmt.Println(0xa) //表示16進制數字a在ASCII所對應的數字
54 
55 
56 }
57 [root@yinzhengjie day3]# 
58 
59 '''

3.判斷變量的數據類型

/*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/

package main

import (
    "fmt"
    "reflect"
)

func main()  {
    str1 := "yinzhengjie" + " hello"
    fmt.Println(reflect.TypeOf(str1))  //判斷變量“str1”的數據類型
    fmt.Println(str1)
    var   str2 byte
    str2 = str1[0] //讓str2=字母"y"在ASCII編碼中所對應的數字"121"(我說的說的是十進制的喲)
    fmt.Println(str2)
    fmt.Println(reflect.TypeOf(str2))  //判斷變量"str2"的數據類型
}


/*
string
yinzhengjie hello
121
uint8

*/

 

4.提升逼格的linux命令

  這個知識點大家可以不看,如果對linux不感興趣的話,可以直接跳過,直接看下面的小試牛刀。如果你看到了一堆“10”你會想到是什么呢?在不眼里可能就是一個數字“10”,但是在一些程序員或者說在黑客眼里,這個“10”是2個數字,即“1”和“0”,是二進制的兩個數字。在unix操作系統中,包括所有的Linux發現版本和mac都是可以用一個命令來查看文件內容的,他能把文件中的內容翻譯成“1001010”類似這種的代碼,也是一些開發人員的裝逼利器:“xxd”,如果用這個命令呢?展示方法如下:

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 '''
 9 [root@yinzhengjie day3]# xxd str_manipulation.go 
10 0000000: 7061 636b 6167 6520 6d61 696e 0a0a 0a0a  package main....
11 0000010: 2f2a 0ae5 ad97 e7ac a6e4 b8b2 e4bf aee6  /*..............
12 0000020: 94b9 efbc 9a0a 312e e58d 95e5 bc95 e58f  ......1.........
13 0000030: b7e6 98af e5ad 97e7 aca6 efbc 8ce5 8f8c  ................
14 0000040: e5bc 95e5 8fb7 e698 afe5 ad97 e7ac a6e4  ................
15 0000050: b8b2 efbc 9b0a 322e e5ad 97e7 aca6 e4b8  ......2.........
16 0000060: b2e6 9cac e8ba abe4 b88d e58f afe4 bba5  ................
17 0000070: e4bf aee6 94b9 efbc 9b0a 332e e980 9ae8  ..........3.....
18 0000080: bf87 e8b7 9f22 5b5d 6279 7465 22e6 95b0  ....."[]byte"...
19 0000090: e7bb 84e7 9bb8 e4ba 92e8 bdac e68d a2e6  ................
20 00000a0: 9da5 e4bf aee6 94b9 efbc 9b0a 2a2f 0a0a  ............*/..
21 00000b0: 696d 706f 7274 2028 0a09 2266 6d74 220a  import (.."fmt".
22 00000c0: 290a 0a66 756e 6320 6d61 696e 2829 2020  )..func main()  
23 00000d0: 7b0a 0973 7472 3120 3a3d 2022 7969 6e7a  {..str1 := "yinz
24 00000e0: 6865 6e67 6a69 6522 202b 2022 776f 726c  hengjie" + "worl
25 00000f0: 6422 202f 2fe6 8bbc e68e a50a 0966 6d74  d" //........fmt
26 0000100: 2e50 7269 6e74 6c6e 2873 7472 3129 0a0a  .Println(str1)..
27 0000110: 0976 6172 2020 7374 7232 2062 7974 6520  .var  str2 byte 
28 0000120: 202f 2f31 e4b8 aae5 ad97 e88a 82ef bc88   //1............
29 0000130: 6279 7465 efbc 893d 38e4 b8aa e6af 94e7  byte...=8.......
30 0000140: 89b9 e4bd 8def bc88 6269 7473 efbc 89ef  ........bits....
31 0000150: bc8c e59b a0e6 ada4 6279 7465 203d 2075  ........byte = u
32 0000160: 696e 7438 0a09 7374 7232 203d 2073 7472  int8..str2 = str
33 0000170: 315b 305d 202f 2fe5 8f96 e5ad 97e7 aca6  1[0] //.........
34 0000180: 0a09 666d 742e 5072 696e 746c 6e28 7374  ..fmt.Println(st
35 0000190: 7232 290a 0966 6d74 2e50 7269 6e74 6628  r2)..fmt.Printf(
36 00001a0: 22e6 95b0 e5ad 97ef bc9a 2564 20e5 ad97  ".........%d ...
37 00001b0: e7ac a6ef bc9a 2563 5c6e 222c 7374 7232  ......%c\n",str2
38 00001c0: 2c73 7472 3229 202f 2fe8 a1a8 e7a4 bae5  ,str2) //.......
39 00001d0: ad97 e7ac a622 7922 e59c a841 5343 4949  ....."y"...ASCII
40 00001e0: e8a1 a8e4 b8ad e5af b9e5 ba94 e79a 84e6  ................
41 00001f0: 95b0 e5ad 97e3 8082 7072 696e 7466 e4b8  ........printf..
42 0000200: 8de4 bc9a e68d a2e8 a18c e4bd 86e6 98af  ................
43 0000210: 7072 696e 746c 6ee4 bc9a e887 aae5 8aa8  println.........
44 0000220: e68d a2e8 a18c e380 820a 0a09 7374 7233  ............str3
45 0000230: 203a 3d20 7374 7231 5b30 3a31 315d 202f   := str1[0:11] /
46 0000240: 2fe5 8887 e789 872c e9a1 bee5 b7a6 e4b8  /......,........
47 0000250: 8de9 a1be e58f b3ef bc8c e58f 9630 2d31  .............0-1
48 0000260: 30e5 85b1 3131 e4b8 aae5 ad97 e7ac a6ef  0...11..........
49 0000270: bc8c e4b8 8de4 bc9a e58e bbe7 9fa5 e981  ................
50 0000280: 93e7 acac 3132 e4b8 aae5 ad97 e7ac a6ef  ....12..........
51 0000290: bc8c e58d b3e4 b88d e4bc 9ae5 8f96 e588  ................
52 00002a0: b0e4 b88b e6a0 87e4 b8ba 3131 e7ac ace5  ..........11....
53 00002b0: ad97 e7ac a622 7722 0a09 666d 742e 5072  ....."w"..fmt.Pr
54 00002c0: 696e 746c 6e28 7374 7233 290a 0a09 7374  intln(str3)...st
55 00002d0: 7234 203a 3d20 7374 7231 5b31 313a 6c65  r4 := str1[11:le
56 00002e0: 6e28 7374 7231 295d 0a09 666d 742e 5072  n(str1)]..fmt.Pr
57 00002f0: 696e 746c 6e28 7374 7234 290a 0a09 7661  intln(str4)...va
58 0000300: 7220 6220 7569 6e74 3820 2f2f e688 91e4  r b uint8 //....
59 0000310: bbac e8bf 99e9 878c e4b9 9fe5 8faf e4bb  ................
60 0000320: a5e6 8a8a 756e 6974 38e5 8699 e688 9062  ....unit8......b
61 0000330: 7974 65ef bc8c e585 b6e5 ae9e e698 afe7  yte.............
62 0000340: ad89 e695 88e7 9a84 e380 820a 0966 6f72  .............for
63 0000350: 2062 203d 2030 3b62 203c 2031 3737 203b   b = 0;b < 177 ;
64 0000360: 622b 2b20 207b 0a09 0966 6d74 2e50 7269  b++  {...fmt.Pri
65 0000370: 6e74 6628 2225 6420 2563 5c6e 222c 622c  ntf("%d %c\n",b,
66 0000380: 6229 0a09 7d0a 0961 7272 6179 203a 3d20  b)..}..array := 
67 0000390: 5b5d 6279 7465 2873 7472 3129 202f 2fe5  []byte(str1) //.
68 00003a0: b086 e5ad 97e7 aca6 e4b8 b2e8 bdac e68d  ................
69 00003b0: a2e6 8890 6279 7465 e695 b0e7 bb84 efbc  ....byte........
70 00003c0: 8ce5 8faf e4bb a5e7 9086 e8a7 a3e6 8890  ................
71 00003d0: e4b8 ba70 7974 686f 6ee4 b8ad e79a 846c  ...python......l
72 00003e0: 6973 742e 0a09 666d 742e 5072 696e 746c  ist...fmt.Printl
73 00003f0: 6e28 6172 7261 7929 0a09 6172 7261 795b  n(array)..array[
74 0000400: 305d 203d 2037 3220 2f2f e4b9 9fe5 8faf  0] = 72 //......
75 0000410: e4bb a5e5 8699 e5ad 97e7 aca6 2748 272c  ............'H',
76 0000420: e59c a841 5343 4949 e4b8 ade4 bb96 e4bb  ...ASCII........
77 0000430: ace6 98af e4b8 80e4 b880 e5af b9e5 ba94  ................
78 0000440: e79a 840a 0973 7472 3120 3d20 7374 7269  .....str1 = stri
79 0000450: 6e67 2861 7272 6179 290a 0966 6d74 2e50  ng(array)..fmt.P
80 0000460: 7269 6e74 6c6e 2873 7472 3129 0a0a 0966  rintln(str1)...f
81 0000470: 6d74 2e50 7269 6e74 6c6e 2827 6127 202b  mt.Println('a' +
82 0000480: 2028 2748 2720 2d20 2768 2729 2920 2f2f   ('H' - 'h')) //
83 0000490: e585 b6e5 ae9e e5b0 b1e6 98af e8bf 99e4  ................
84 00004a0: ba9b e5ad 97e7 aca6 e59c a841 5343 4949  ...........ASCII
85 00004b0: e4b8 ade7 9a84 e695 b0e5 ad97 e79b b8e5  ................
86 00004c0: 8aa0 e587 8fef bc8c e5be 97e5 88b0 e79a  ................
87 00004d0: 84e6 95b0 e5ad 97e4 b8ba 3635 e380 820a  ..........65....
88 00004e0: 0966 6d74 2e50 7269 6e74 6c6e 2830 7861  .fmt.Println(0xa
89 00004f0: 2920 2f2f e8a1 a8e7 a4ba 3136 e8bf 9be5  ) //......16....
90 0000500: 88b6 e695 b0e5 ad97 61e5 9ca8 4153 4349  ........a...ASCI
91 0000510: 49e6 8980 e5af b9e5 ba94 e79a 84e6 95b0  I...............
92 0000520: e5ad 970a 0a0a 7d0a                      ......}.
93 [root@yinzhengjie day3]# 
94 
95 '''
xxd命令用法展示

5.小試牛刀

A.用Golang語言實現將小寫字母轉換成大寫字母。

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 '''
 9 [root@yinzhengjie day3]# more uppercase.go
10 package main
11 
12 import "fmt"
13 
14 func main() {
15         topper("yinzhengjie") //我們在調用函數的時候輸入的是小寫字母
16 }
17 
18 func topper(s string) string { //后面的string表示返回值的類型。
19         array := []byte(s) //將字符串轉換成字節
20         var (
21                 i   int
22                 res string
23         )
24         for i = 0; i < len(s); i++ {
25                 fmt.Printf(string(array[i] - 32)) //格式化輸出,將每一次循環的變量i都保存下來。如果不敲擊這一
26 行默認只會保留最后一次循環的值.
27                 res = string(array[i] - 32) //將字節轉換成字符串並賦值給res字符串.
28         }
29         fmt.Println(res)
30         return res
31 }
32 [root@yinzhengjie day3]#
33 [root@yinzhengjie day3]#
34 [root@yinzhengjie day3]# go run uppercase.go  //實現結果如下
35 YINZHENGJIEE
36 [root@yinzhengjie day3]#
37 '''

  以上代碼你看起來可能特別簡單,而且思路不嚴謹,沒有判斷字母大小寫就同意轉換成大寫的操作!那么如何優化呢?請看下面的代碼,稍微做了一下優化的代碼風格就有所改變。

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 '''
 9 [root@yinzhengjie day3]# more lower_upper.go 
10 package main
11 
12 import "fmt"
13 
14 func main() {
15         topper("yinzhengjie") //我們在調用函數的時候輸入的是小寫字母
16 
17 }
18 
19 func topper(s string) string {
20         num := []byte(s) //將傳入的字符串轉換成字節所對應的數字的數組。
21         for i,v := range num { //循環這個數組
22                 if v >= 'a' && v <= 'z' { //判斷這個數字的值是否為小寫
23                         num[i] = v - 32  //如果是小姐,就根據ASCII編碼表的位置關系,將其轉換成大寫。
24                 }
25         }
26         fmt.Println(string(num)) 
27         return string(num)  //返回這個數組,通過ASCII編碼表中的數字找到對應的字符串並返回。
28 }
29 [root@yinzhengjie day3]# 
30 [root@yinzhengjie day3]# 
31 [root@yinzhengjie day3]# go run lower_upper.go 
32 YINZHENGJIE
33 [root@yinzhengjie day3]# 
34 '''

B.用Golang語言試下將字母的順序顛倒,專業術語叫反轉。

   在寫這個小程序之前我們需要了解一下rune這個包,大家都知道byte,眾所周知的字節,一個字節等於八個比特位,一個比特位存着響應的字母或是數字以及一些特殊符號等等,但是存取中國的漢字一個字節是遠遠不夠的,可能用到三到四個字節進行存取的,所以我們之前將字母小寫轉換成大寫就不好使了。因為你會發現自己是取不到下表的,一個漢字需要三個字節存取,你想讀取漢字的時候必須也得取三個字節才能讀到這個漢字,如果只取一個字節的話就會亂碼。當然知道這個原理后我用byte也實現了反轉的功能,但是真的太麻煩了(隨着漢字的數量不同,我得判斷字節循環的起點數量)。我找到了rune這個包,真的很好使,話不多說,我們直接上代碼對比一下輸出結果您就清楚了。代碼請點擊下面的小標題。

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "reflect"
 6 )
 7 
 8 func main() {
 9     yzj := "尹正傑ABCD"
10     yzj2 := []rune(yzj) //rune類型
11     yzj3 := []byte(yzj) //byte類型
12     for k, v := range yzj {
13         fmt.Println(k, "=字符串遍歷=>", v)
14     }
15     for k, v := range yzj2 {
16         fmt.Println(k, "=rune遍歷=>", v)
17     }
18     for k, v := range yzj3 {
19         fmt.Println(k, "=byte遍歷=>", v)
20     }
21     fmt.Println("讓我們來一起看看'byte'的數據類型吧:",reflect.TypeOf(yzj3))
22     fmt.Println("讓我們來一起看看'rune'的數據類型吧:",reflect.TypeOf(yzj2))
23 }
24 
25 
26 
27 
28 #以上代碼執行結果如下:
29 0 =字符串遍歷=> 23609
30 3 =字符串遍歷=> 27491
31 6 =字符串遍歷=> 26480
32 9 =字符串遍歷=> 65
33 10 =字符串遍歷=> 66
34 11 =字符串遍歷=> 67
35 12 =字符串遍歷=> 68
36 0 =rune遍歷=> 23609
37 1 =rune遍歷=> 27491
38 2 =rune遍歷=> 26480
39 3 =rune遍歷=> 65
40 4 =rune遍歷=> 66
41 5 =rune遍歷=> 67
42 6 =rune遍歷=> 68
43 0 =byte遍歷=> 229
44 1 =byte遍歷=> 176
45 2 =byte遍歷=> 185
46 3 =byte遍歷=> 230
47 4 =byte遍歷=> 173
48 5 =byte遍歷=> 163
49 6 =byte遍歷=> 230
50 7 =byte遍歷=> 157
51 8 =byte遍歷=> 176
52 9 =byte遍歷=> 65
53 10 =byte遍歷=> 66
54 11 =byte遍歷=> 67
55 12 =byte遍歷=> 68
56 讓我們來一起看看'byte'的數據類型吧: []uint8
57 讓我們來一起看看'rune'的數據類型吧: []int32
對比string,byte,rune存取漢字的方式

 

姿勢一:用rune實現將字符倒着打印即可完成反轉功能

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main()  {
13     yzj := "尹正傑world歡迎你"
14     yzj2 := []rune(yzj) //rune類型
15     for i := len(yzj2) - 1; i >= 0; i-- {  //從最后一個字符開始倒着打印
16         fmt.Printf(string(yzj2[i]))
17     }
18 }
19 
20 
21 
22 
23 #以上代碼執行結果如下:
24 你迎歡dlrow傑正尹

姿勢二:思路和姿勢一一樣,知識角度不同(咳咳,我說的角度知識換了一個循環方式而已)

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main()  {
13     yzj := "尹正傑Glang"
14     yzj2 := []rune(yzj) //rune類型
15     for k := range yzj2 { //利用數字循環倒着打印,思路跟姿勢一一樣
16         fmt.Printf(string(yzj2[len(yzj2)-k-1]))
17     }
18 }
19 
20 
21 #以上代碼執行結果如下:
22 gnalG傑正尹

姿勢三:“69”互換,“咳咳,嚴格的來說應該是首末互換”,有兩行代碼被我注釋掉了,大家可以把它注釋取消掉,然后就能親手體會這種感覺了。

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 
 9 package main
10 
11 import (
12     "fmt"
13 )
14 
15 func main()  {
16     strs := "北京歡迎你"
17     num  := []rune(strs)
18     lang := len(num)
19     //fmt.Println(num)
20     for i,j := 0,lang-1;i<j;i,j = i+1,j-1 { //這種思路就是把最后一個字符和第一個字符互換,循環到最中間的那個就不做任何操作
21         //fmt.Println(i,j)
22         num[i],num[j] = num[j],num[i]
23     }
24     fmt.Println(string(num))
25 }
26 
27 
28 
29 #以上代碼執行結果如下:
30 你迎歡京北

  相比通過這個小程序,發現Golang的for循環很好玩吧。下面跟着我一起來學習一下Golang的for循環吧。

 

三.循環語句

  說道循環,那Golang里面的姿勢可多了,得給你漲漲經驗了,光我所知道的就有4種,別問我最喜歡那種姿勢,這個你得用手去感受,用心去體會,別想歪啊,我是說用手去敲代碼感受,用心去研究那種循環的姿勢最適合你。話不多收我們開干吧!

1.姿勢一:這種循環玩shell的童鞋一看便知。

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 
11 import (
12     "fmt"
13 )
14 
15 func main()  {
16     for i := 0;i <= 5 ;i++  {
17         fmt.Println(i)
18     }
19 }
20 
21 
22 
23 
24 
25 #以上代碼輸出結果如下:
26 0
27 1
28 2
29 3
30 4
31 5

2.姿勢二:類似python中的while循環

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 
11 import (
12     "fmt"
13 )
14 
15 func main()  {
16     i := 1
17     for i < 10 {
18         fmt.Println(i)
19         i = i + 2
20     }
21 }
22 
23 
24 #以上代碼執行結果如下:
25 1
26 3
27 5
28 7
29 9

3.姿勢三:類似於python中的while循環

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 
11 import (
12 "fmt"
13 )
14 
15 func main()  {
16     i := 8
17     for {
18         i = i + 1
19         fmt.Println(i)
20         if i > 10 {
21             break
22         }
23 
24     }
25 }
26 
27 
28 #以上代碼執行結果如下:
29 9
30 10
31 11

 

4.姿勢四:遍歷數組循環.

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 
11 import (
12     "fmt"
13 
14 )
15 
16 func main()  {
17     s := "尹正傑2017"
18     for i,arg := range s {
19         fmt.Printf("%d %c\n",i,arg)
20     }
21 }
22 
23 
24 
25 
26 #以上代碼執行結果如下:
27 0 尹
28 329 630 9 2
31 10 0
32 11 1
33 12 7

 

四.條件判斷

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "strconv"
12     "fmt"
13 )
14 //注意:"strconv.Atoi"只能講數字轉換成字符串,如果不是純數字的字符串是沒法發轉換的喲。
15 func main()  {
16     s := "尹正傑2017"
17     n,err := strconv.Atoi(s) //用"n""err"兩個參數來接受“strconv.Atoi”的值,如果正常就把值傳給變量"n",如果異常就把值傳給"err"18     if err != nil { //如果錯誤信息不為空,那么就執行大括號的代碼。
19         fmt.Println("'strconv.Atoi'傳入的參數有問題喲!看報錯內容是>>>:",err) //將接受的錯誤信息打印出來。
20         return //出現這行代碼就不會往下走啦,直接就終止這個函數了。
21     }
22     fmt.Println(n)
23     fmt.Println("1111")
24 }
25 
26 
27 
28 
29 
30 #以上代碼執行結果如下:
31 'strconv.Atoi'傳入的參數有問題喲!看報錯內容是>>>: strconv.Atoi: parsing "尹正傑2017": invalid syntax

 

五.運算符

  其實運算符,這些知識都是小學三年級的朋友都會的,簡單點的無非就是加減乘除,我不打算詳細介紹,剛興趣的童鞋可以去Golang官網去看看關於運算符的,我這里簡單的協議一個最low的小程序給大家看最基礎的小程序,好了,天黑了,大神請閉眼,小白請睜眼。小白你要跟我一起擼嗎?來吧,別克制!

 1 [root@yinzhengjie day3]# gofmt myexpr.go 
 2 /*
 3 #!/usr/bin/env gorun
 4 @author :yinzhengjie
 5 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 6 EMAIL:y1053419035@qq.com
 7 */
 8 
 9 package main
10 
11 import (
12         "fmt"
13         "os"
14         "strconv"
15 )
16 
17 func main() {
18         var (
19                 x int
20                 y int
21                 //res int
22         )
23         x, _ = strconv.Atoi(os.Args[1]) //將字符串轉換成數字
24         y, _ = strconv.Atoi(os.Args[3])
25         switch os.Args[2] {
26         case "+":
27                 fmt.Printf("運算結果是:%d\n", x+y)
28         case "-":
29                 fmt.Printf("運算結果是:%d\n", x-y)
30         case "*":
31                 fmt.Printf("運算結果是:%d\n", x*y)
32         case "/":
33                 fmt.Printf("運算結果是:%d\n", x/y)
34         case "%":
35                 fmt.Printf("運算結果是:%d\n", x%y)
36         }
37         //fmt.Println(os.Args[1])
38 }
39 [root@yinzhengjie day3]# 
40 [root@yinzhengjie day3]# go run myexpr.go 11 + 22
41 運算結果是:33
42 [root@yinzhengjie day3]# go run myexpr.go 11 - 3
43 運算結果是:8
44 [root@yinzhengjie day3]# go run myexpr.go 11 \* 8
45 運算結果是:88
46 [root@yinzhengjie day3]# go run myexpr.go 11 / 3
47 運算結果是:3
48 [root@yinzhengjie day3]# go run myexpr.go 11 % 3
49 運算結果是:2
50 [root@yinzhengjie day3]# 

 

 六.文件操作

 1.文件的寫入

a>.打開一個文件,如果沒有就創建,如果有這個文件就清空文件內容(相當於python中的"w");

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "os"
12     "log"
13 )
14 
15 
16 
17 func main()  {
18     f,err := os.Create("a.txt") //姿勢一:打開一個文件,如果沒有就創建,如果有這個文件就清空文件內容,需要用兩個變量接受相應的參數
19     if err != nil {
20         log.Fatal(err)
21     }
22     f.WriteString("yinzhengjie\n") //往文件寫入相應的字符串。
23     f.Close()
24 }

b>.以追加的方式打開一個文件(相當於python中的"a");

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "os"
12     "log"
13 )
14 
15 
16 func main()  {
17     f,err := os.OpenFile("a.txt",os.O_APPEND|os.O_CREATE|os.O_RDWR,0644) //表示最佳的方式打開文件,如果不存在就創建,打開的模式是可讀可寫,權限是644
18     if err    != nil {
19         log.Fatal(err)
20     }
21     f.WriteString("yinzhengjie\n")
22     f.Close()
23 }

c>.修改文件內容-隨機寫入(自定義插入的位置,相當python重的seek方法);

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "os"
12     "log"
13 )
14 
15 
16 func main()  {
17     f,err := os.OpenFile("a.txt",os.O_CREATE|os.O_RDWR,0644)
18     if err != nil {
19         log.Fatal(err)
20     }
21     f.WriteString("yinzhengjie\n")
22     f.Seek(1,os.SEEK_SET) //表示文件的其實位置,從第二個字符往后寫入。
23     f.WriteString("$$$")
24     f.Close()
25 }

2.文件的讀取

A>.順序讀取文件內容

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 
 9 package main
10 
11 import (
12     "os"
13     "bufio"
14     "io"
15     "fmt"
16     "log"
17 )
18 
19 //姿勢一:讀取文件內容
20 func main()  {
21     //f,err := os.OpenFile("a.txt",os.O_CREATE|os.O_RDWR,0644) //打開該文件,但是不建議用這行命令,用下面的專門用來讀取文件的。
22     f,err := os.Open("a.txt") //打開一個文件,如果這個文件不存在的話就會報錯。
23     if err != nil {
24         log.Fatal(err)
25     }
26     r := bufio.NewReader(f) //取出文件的內容
27     for {
28         line,err := r.ReadString('\n') //表示以"\n"為分隔符,遇到"\n"就換行。
29         if err == io.EOF{ //讀到文件結尾后就終止文件。
30             break
31         }
32         fmt.Print(line)
33     }
34     f.Close()
35 }
36 
37 
38 
39 #以上代碼執行結果如下:
40 y$$$hengjie
41 yinzhengjie

B>.隨機讀取文件內容

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 
 9 package main
10 
11 import (
12     "os"
13     "bufio"
14     "io"
15     "fmt"
16     "log"
17 )
18 
19 
20 func main()  {
21     f,err := os.OpenFile("yinzhengjie.txt",os.O_CREATE|os.O_RDWR,0644)
22     if err != nil {
23         log.Fatal(err)
24     }
25     r := bufio.NewReader(f)
26     for {
27         line,err := r.ReadString('\n') //表示以"\n"為分隔符,遇到"\n"就換行。
28         if err == io.EOF{ //讀到文件結尾后就終止文件。因此如果你這么干了的話,你始終只能讀取到第一行的內容
29             break
30         }
31         fmt.Print(line)
32     }
33     f.Close()
34 }
35 
36 
37 
38 #以上代碼執行結果如下:
39 歡迎來到我的博客:http://www.cnblogs.com/yinzhengjie

C.用ioutil模塊讀取文件內容;

  要注意的是ioutil下有個讀取文件的方法,但是讀取出來的都是bytes,因此你需要將bytes轉換成字符串,然后才打印給用戶才好使。

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "fmt"
12     "io/ioutil"
13     "log"
14 )
15 
16 func main()  {
17     buf,err := ioutil.ReadFile("D:\\Golang環境\\Golang Program\\Golang lesson\\Day4\\單詞.txt")
18     if err != nil {
19         log.Fatal(err)
20     }
21     fmt.Println(string(buf))
22 }
23 
24 
25 
26 #以上代碼執行結果如下:
27    Scanner provides a convenient interface for reading data such as a file of newline-delimited lines of text Successive
28 calls to the Scan method will step through the tokens of a file skipping the bytes between the tokens The specification
29 of a token is defined by a split function of type SplitFunc the default split function breaks the input into lines with
30 line termination stripped Split functions are defined in this package for scanning a file into lines bytes UTF-8-encoded
31 runes and space-delimited words The client may instead provide a custom split function

 

3.小試牛刀

A.>.用Golang編寫99乘法表;

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 
 9 package main
10 
11 import (
12     "fmt"
13     "os"
14     "log"
15 
16 )
17 
18 func main() {
19     var top int = 10
20     //f,err := os.Create("乘法表.txt")
21     f,err := os.OpenFile("乘法表.txt",os.O_CREATE|os.O_RDWR,0644)
22     if err != nil {
23         log.Fatal(err)
24     }
25     for i:=1; i<top; i++ {
26         for j := 1;j<=i;j++ {
27             fmt.Fprintf(f,"%d * %d = %2d\t", i , j, i*j)
28         }
29         fmt.Fprintln(f)
30     }
31     f.Close()
32 }
用Golang將九九乘法表寫入到文件中
 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 
 9 package main
10 
11 import (
12     "fmt"
13     "os"
14     "log"
15 
16     "bufio"
17     "io"
18 )
19 
20 func main()  {
21     f,err := os.Open("乘法表.txt") //打開一個文件,如果這個文件不存在的話就會報錯。
22     if err != nil {
23         log.Fatal(err)
24     }
25     r := bufio.NewReader(f) //取出文件的內容
26     for {
27         line,err := r.ReadString('\n') //表示以"\n"為分隔符,遇到"\n"就換行。
28         if err == io.EOF{ //讀到文件結尾后就終止文件。
29             break
30         }
31         fmt.Print(line)
32     }
33     f.Close()
34 }
35 
36 
37 
38 #以上代碼執行結果如下:
39 1 * 1 =  1    
40 2 * 1 =  2    2 * 2 =  4    
41 3 * 1 =  3    3 * 2 =  6    3 * 3 =  9    
42 4 * 1 =  4    4 * 2 =  8    4 * 3 = 12    4 * 4 = 16    
43 5 * 1 =  5    5 * 2 = 10    5 * 3 = 15    5 * 4 = 20    5 * 5 = 25    
44 6 * 1 =  6    6 * 2 = 12    6 * 3 = 18    6 * 4 = 24    6 * 5 = 30    6 * 6 = 36    
45 7 * 1 =  7    7 * 2 = 14    7 * 3 = 21    7 * 4 = 28    7 * 5 = 35    7 * 6 = 42    7 * 7 = 49    
46 8 * 1 =  8    8 * 2 = 16    8 * 3 = 24    8 * 4 = 32    8 * 5 = 40    8 * 6 = 48    8 * 7 = 56    8 * 8 = 64    
47 9 * 1 =  9    9 * 2 = 18    9 * 3 = 27    9 * 4 = 36    9 * 5 = 45    9 * 6 = 54    9 * 7 = 63    9 * 8 = 72    9 * 9 = 81    

B>.模擬linux操作系統中的ls基礎功能命令;

 1 [root@yinzhengjie day3]# gofmt ls.go 
 2 /*
 3 #!/usr/bin/env gorun
 4 @author :yinzhengjie
 5 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 6 EMAIL:y1053419035@qq.com
 7 */
 8 
 9 package main
10 
11 import (
12         "fmt"
13         "log"
14         "os"
15 )
16 
17 func main() {
18         f, err := os.Open(os.Args[1]) //表示把該程序的第一個字符串傳進去,就好像模擬簡單的ls命令
19         if err != nil {
20                 log.Fatal(err)
21         }
22         infos, _ := f.Readdir(-1) //表示列出所有的文件或目錄
23         for _, info := range infos {
24                 fmt.Printf("是否為目錄:%V ;文件或者目錄大小:%d;目錄名稱是:%s\n", info.IsDir(), info.Size(), info.Name())
25         }
26         f.Close()
27 }
28 [root@yinzhengjie day3]# 
29 [root@yinzhengjie day3]# go run ls.go .
30 是否為目錄:%!V(bool=false) ;文件或者目錄大小:601;目錄名稱是:reversal.go
31 是否為目錄:%!V(bool=false) ;文件或者目錄大小:708;目錄名稱是:myexpr.go
32 是否為目錄:%!V(bool=false) ;文件或者目錄大小:641;目錄名稱是:ls.go
33 [root@yinzhengjie day3]# go run ls.go ~/
34 是否為目錄:%!V(bool=false) ;文件或者目錄大小:1498;目錄名稱是:.viminfo
35 是否為目錄:%!V(bool=false) ;文件或者目錄大小:324;目錄名稱是:.bash_profile
36 是否為目錄:%!V(bool=true) ;文件或者目錄大小:4096;目錄名稱是:.pki
37 是否為目錄:%!V(bool=false) ;文件或者目錄大小:129;目錄名稱是:.tcshrc
38 是否為目錄:%!V(bool=false) ;文件或者目錄大小:12288;目錄名稱是:.bash_profile.swp
39 是否為目錄:%!V(bool=false) ;文件或者目錄大小:12790;目錄名稱是:.bash_history
40 是否為目錄:%!V(bool=false) ;文件或者目錄大小:18;目錄名稱是:.bash_logout
41 是否為目錄:%!V(bool=false) ;文件或者目錄大小:2856;目錄名稱是:anaconda-ks.cfg
42 是否為目錄:%!V(bool=false) ;文件或者目錄大小:56;目錄名稱是:.gitconfig
43 是否為目錄:%!V(bool=false) ;文件或者目錄大小:176;目錄名稱是:.bashrc
44 是否為目錄:%!V(bool=true) ;文件或者目錄大小:4096;目錄名稱是:.ssh
45 是否為目錄:%!V(bool=false) ;文件或者目錄大小:12480;目錄名稱是:install.log
46 是否為目錄:%!V(bool=false) ;文件或者目錄大小:4088;目錄名稱是:install.log.syslog
47 是否為目錄:%!V(bool=false) ;文件或者目錄大小:100;目錄名稱是:.cshrc
48 [root@yinzhengjie day3]# 
49 [root@yinzhengjie day3]# go run ls.go  /tmp/
50 是否為目錄:%!V(bool=true) ;文件或者目錄大小:4096;目錄名稱是:go-build655748897
51 是否為目錄:%!V(bool=false) ;文件或者目錄大小:1092;目錄名稱是:ks-script-ddWzzz
52 是否為目錄:%!V(bool=true) ;文件或者目錄大小:4096;目錄名稱是:cactiez
53 是否為目錄:%!V(bool=false) ;文件或者目錄大小:0;目錄名稱是:ks-script-ddWzzz.log
54 是否為目錄:%!V(bool=true) ;文件或者目錄大小:4096;目錄名稱是:go-build551514124
55 是否為目錄:%!V(bool=true) ;文件或者目錄大小:4096;目錄名稱是:.ICE-unix
56 是否為目錄:%!V(bool=false) ;文件或者目錄大小:52475;目錄名稱是:ins.log
57 是否為目錄:%!V(bool=false) ;文件或者目錄大小:0;目錄名稱是:yum.log
58 [root@yinzhengjie day3]# 

C>.模擬操作系統中的ps基礎功能命令;

 1 [root@yinzhengjie day3]# more ps.go 
 2 /*
 3 #!/usr/bin/env gorun
 4 @author :yinzhengjie
 5 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 6 EMAIL:y1053419035@qq.com
 7 */
 8 
 9 
10 package main
11 
12 import (
13         "os"
14         "log"
15         "fmt"
16         "strconv"
17         "io/ioutil"
18 )
19 /*
20 注意:linux操作系統中:/proc存放的進程的PID,基本上都是以數字目錄形式記錄,而在這些數字目錄中的“cmdline”文件則記錄着具體進程,當然還有exe記錄的信息更加完整!
21 */
22 
23 func main() {
24         filepath := "/proc"
25         f,err := os.Open(filepath) //打開文件路徑,如果打開當前路徑就輸入“.”
26         if err != nil {
27                 log.Fatal(err)
28         }
29         infos,_ := f.Readdir(-1)        //表示最大讀取的個數,這個“-1”表示讀取該文件的全部內容。
30         for _,info := range infos{
31                 //fmt.Printf("是否是目錄:%v 文件大小是:%d 文件名稱是:%s\n",info.IsDir(),info.Size(),info.Name())
32                 if info.IsDir() {
33                         n,err := strconv.Atoi(info.Name())              //將字符串轉換成數字,但是並不是所有的字符串都能轉換成數字喲!除非字符串本分並不包含非數字的元素。
34                         if err != nil {
35                                 //fmt.Println("轉換失敗:",err)
36                                 continue
37                         }
38                         //fmt.Println(n)
39                         filepath = filepath+"/"+ info.Name()
40                         f1,err := os.Open(filepath)
41                         if err != nil {
42                                 log.Fatal(err)
43                         }
44                         filepath = "/proc"
45                         files,_ := f1.Readdir(-1)
46                         for _,arg := range files{
47                                 if arg.Name()=="cmdline" {
48                         //              fmt.Println(arg.Name())
49                                         buf,err := ioutil.ReadFile(filepath+"/"+ info.Name()+"/"+arg.Name())
50                                         if err != nil {
51                                                 log.Fatal(err)
52                                         }
53                                         fmt.Println(n,string(buf))
54                                 }
55                         }
56                 }
57         }
58         f.Close()
59 }
60 [root@yinzhengjie day3]# 
最初筆記戳這里,下面未折疊的是我優化后的代碼
 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11         "fmt"
12         "io/ioutil"
13         "log"
14         "os"
15         "strconv"
16 )
17 
18 func catFile(pid string, fileName string) {
19         var s string
20         buf, err := ioutil.ReadFile(fileName) //讀取文件內容,即pid/cmdline文件內容
21         if err != nil {
22                 log.Fatal(err) //如果文件不存在或是權限異常就打印出來,並且會附帶時間戳效果喲!
23                 return
24         }
25         s = string(buf) //將讀取的內容變成字符串。
26         if len(s) > 0 { //如果讀取的cmdline文件的內容不為空,就打印其的PID(數字目錄)和進程名稱。
27                 fmt.Printf("進程的PID是:%v\t進程的名稱是:%v\n", pid, s)
28         } else {
29 
30                 fmt.Println("我天,這個PID進程是屬於系統的BASH的喲!")
31         }
32 }
33 
34 func main() {
35         var fileName string
36         f, err := os.Open(os.Args[1]) //打開命令行位置參數下表為1的文件。
37         fmt.Println(f)
38         if err != nil {
39                 log.Fatal(err)
40         }
41         infos, _ := f.Readdir(-1) //獲取目錄下的所有文件和目錄。
42         for _, info := range infos {
43                 _, err := strconv.Atoi(info.Name())
44                 if info.IsDir() && err == nil { //判斷是否為目錄,並且轉換成int類型時無報錯
45                         fileName = os.Args[1] + info.Name() + "/cmdline" //拼接其絕對路徑。
46                         catFile(info.Name(), fileName)                   //將數字的目錄和其絕對路徑傳給函數catFile函數。
47                 }
48         }
49         f.Close()
50 }

  注意:以上代碼僅適用於Linux操作系統,可能你換成MAC就不好使了,WINDOWS也不好使,建議用CentOs對代碼進行測試,因為系統都有/proc目錄。

  1 [root@yinzhengjie day3]# gofmt -w ps.go 
  2 [root@yinzhengjie day3]# go run ps.go /proc/
  3 &{0xc42006e080}
  4 進程的PID是:1  進程的名稱是:/sbin/init
  5 我天,這個PID進程是屬於系統的BASH的喲!
  6 我天,這個PID進程是屬於系統的BASH的喲!
  7 我天,這個PID進程是屬於系統的BASH的喲!
  8 我天,這個PID進程是屬於系統的BASH的喲!
  9 我天,這個PID進程是屬於系統的BASH的喲!
 10 我天,這個PID進程是屬於系統的BASH的喲!
 11 我天,這個PID進程是屬於系統的BASH的喲!
 12 我天,這個PID進程是屬於系統的BASH的喲!
 13 我天,這個PID進程是屬於系統的BASH的喲!
 14 我天,這個PID進程是屬於系統的BASH的喲!
 15 我天,這個PID進程是屬於系統的BASH的喲!
 16 我天,這個PID進程是屬於系統的BASH的喲!
 17 我天,這個PID進程是屬於系統的BASH的喲!
 18 我天,這個PID進程是屬於系統的BASH的喲!
 19 我天,這個PID進程是屬於系統的BASH的喲!
 20 我天,這個PID進程是屬於系統的BASH的喲!
 21 我天,這個PID進程是屬於系統的BASH的喲!
 22 我天,這個PID進程是屬於系統的BASH的喲!
 23 我天,這個PID進程是屬於系統的BASH的喲!
 24 我天,這個PID進程是屬於系統的BASH的喲!
 25 我天,這個PID進程是屬於系統的BASH的喲!
 26 我天,這個PID進程是屬於系統的BASH的喲!
 27 我天,這個PID進程是屬於系統的BASH的喲!
 28 我天,這個PID進程是屬於系統的BASH的喲!
 29 我天,這個PID進程是屬於系統的BASH的喲!
 30 我天,這個PID進程是屬於系統的BASH的喲!
 31 我天,這個PID進程是屬於系統的BASH的喲!
 32 我天,這個PID進程是屬於系統的BASH的喲!
 33 我天,這個PID進程是屬於系統的BASH的喲!
 34 我天,這個PID進程是屬於系統的BASH的喲!
 35 我天,這個PID進程是屬於系統的BASH的喲!
 36 我天,這個PID進程是屬於系統的BASH的喲!
 37 我天,這個PID進程是屬於系統的BASH的喲!
 38 我天,這個PID進程是屬於系統的BASH的喲!
 39 我天,這個PID進程是屬於系統的BASH的喲!
 40 我天,這個PID進程是屬於系統的BASH的喲!
 41 我天,這個PID進程是屬於系統的BASH的喲!
 42 我天,這個PID進程是屬於系統的BASH的喲!
 43 我天,這個PID進程是屬於系統的BASH的喲!
 44 我天,這個PID進程是屬於系統的BASH的喲!
 45 我天,這個PID進程是屬於系統的BASH的喲!
 46 我天,這個PID進程是屬於系統的BASH的喲!
 47 我天,這個PID進程是屬於系統的BASH的喲!
 48 我天,這個PID進程是屬於系統的BASH的喲!
 49 我天,這個PID進程是屬於系統的BASH的喲!
 50 我天,這個PID進程是屬於系統的BASH的喲!
 51 我天,這個PID進程是屬於系統的BASH的喲!
 52 我天,這個PID進程是屬於系統的BASH的喲!
 53 我天,這個PID進程是屬於系統的BASH的喲!
 54 我天,這個PID進程是屬於系統的BASH的喲!
 55 我天,這個PID進程是屬於系統的BASH的喲!
 56 我天,這個PID進程是屬於系統的BASH的喲!
 57 我天,這個PID進程是屬於系統的BASH的喲!
 58 我天,這個PID進程是屬於系統的BASH的喲!
 59 我天,這個PID進程是屬於系統的BASH的喲!
 60 我天,這個PID進程是屬於系統的BASH的喲!
 61 我天,這個PID進程是屬於系統的BASH的喲!
 62 我天,這個PID進程是屬於系統的BASH的喲!
 63 我天,這個PID進程是屬於系統的BASH的喲!
 64 我天,這個PID進程是屬於系統的BASH的喲!
 65 進程的PID是:406        進程的名稱是:/sbin/udevd-d
 66 我天,這個PID進程是屬於系統的BASH的喲!
 67 我天,這個PID進程是屬於系統的BASH的喲!
 68 我天,這個PID進程是屬於系統的BASH的喲!
 69 我天,這個PID進程是屬於系統的BASH的喲!
 70 進程的PID是:1317       進程的名稱是:/usr/sbin/vmware-vmblock-fuse-osubtype=vmware-vmblock,default_permissions,allow_other/var/run/vmblock-fuse
 71 進程的PID是:1338       進程的名稱是:/usr/sbin/vmtoolsd
 72 進程的PID是:1363       進程的名稱是:/usr/lib/vmware-vgauth/VGAuthService-s
 73 進程的PID是:1423       進程的名稱是:./ManagementAgentHost
 74 進程的PID是:1619       進程的名稱是:auditd
 75 進程的PID是:1641       進程的名稱是:/sbin/portreserve
 76 進程的PID是:1649       進程的名稱是:/sbin/rsyslogd-i/var/run/syslogd.pid-c5
 77 進程的PID是:1679       進程的名稱是:irqbalance--pid=/var/run/irqbalance.pid
 78 進程的PID是:1695       進程的名稱是:rpcbind
 79 進程的PID是:1740       進程的名稱是:dbus-daemon--system
 80 進程的PID是:1753       進程的名稱是:NetworkManager--pid-file=/var/run/NetworkManager/NetworkManager.pid
 81 進程的PID是:1758       進程的名稱是:/usr/sbin/modem-manager
 82 進程的PID是:1774       進程的名稱是:rpc.statd
 83 進程的PID是:1810       進程的名稱是:cupsd-C/etc/cups/cupsd.conf
 84 進程的PID是:1838       進程的名稱是:/usr/sbin/wpa_supplicant-c/etc/wpa_supplicant/wpa_supplicant.conf-B-u-f/var/log/wpa_supplicant.log-P/var/run/wpa_supplicant.pid
 85 進程的PID是:1855       進程的名稱是:/usr/sbin/acpid
 86 進程的PID是:1865       進程的名稱是:hald
 87 進程的PID是:1866       進程的名稱是:hald-runner
 88 進程的PID是:1911       進程的名稱是:hald-addon-input: Listening on /dev/input/event0 /dev/input/event2
 89 進程的PID是:1917       進程的名稱是:hald-addon-acpi: listening on acpid socket /var/run/acpid.socket
 90 進程的PID是:1943       進程的名稱是:/usr/sbin/sshd
 91 進程的PID是:1953       進程的名稱是:xinetd-stayalive-pidfile/var/run/xinetd.pid
 92 進程的PID是:2112       進程的名稱是:/usr/libexec/postfix/master
 93 進程的PID是:2133       進程的名稱是:qmgr-l-tfifo-u
 94 進程的PID是:2140       進程的名稱是:/usr/sbin/abrtd
 95 進程的PID是:2151       進程的名稱是:crond
 96 進程的PID是:2165       進程的名稱是:/usr/sbin/atd
 97 進程的PID是:2178       進程的名稱是:/usr/sbin/cimserver
 98 進程的PID是:2204       進程的名稱是:/sbin/mingetty/dev/tty2
 99 進程的PID是:2206       進程的名稱是:/sbin/mingetty/dev/tty3
100 進程的PID是:2208       進程的名稱是:/sbin/mingetty/dev/tty4
101 進程的PID是:2210       進程的名稱是:/sbin/mingetty/dev/tty5
102 進程的PID是:2212       進程的名稱是:/sbin/mingetty/dev/tty6
103 進程的PID是:2251       進程的名稱是:/usr/sbin/console-kit-daemon--no-daemon
104 進程的PID是:2327       進程的名稱是:/usr/libexec/devkit-power-daemon
105 進程的PID是:2379       進程的名稱是:/usr/libexec/polkit-1/polkitd
106 進程的PID是:2392       進程的名稱是:/usr/libexec/rtkit-daemon
107 進程的PID是:2513       進程的名稱是:/usr/libexec/udisks-daemon
108 進程的PID是:2515       進程的名稱是:udisks-daemon: polling /dev/sr0
109 進程的PID是:2578       進程的名稱是:/usr/sbin/restorecond-u
110 我天,這個PID進程是屬於系統的BASH的喲!
111 我天,這個PID進程是屬於系統的BASH的喲!
112 進程的PID是:3333       進程的名稱是:/sbin/dmeventd
113 我天,這個PID進程是屬於系統的BASH的喲!
114 我天,這個PID進程是屬於系統的BASH的喲!
115 進程的PID是:3581       進程的名稱是:/sbin/udevd-d
116 進程的PID是:3582       進程的名稱是:/sbin/udevd-d
117 進程的PID是:6520       進程的名稱是:/sbin/mingetty/dev/tty1
118 進程的PID是:6689       進程的名稱是:/usr/sbin/gdm-binary-nodaemon
119 進程的PID是:6704       進程的名稱是:/usr/libexec/gdm-simple-slave--display-id/org/gnome/DisplayManager/Display1
120 進程的PID是:6707       進程的名稱是:/usr/bin/Xorg:0-br-verbose-audit4-auth/var/run/gdm/auth-for-gdm-IfKotc/database-nolistentcpvt1
121 進程的PID是:6728       進程的名稱是:/usr/bin/dbus-launch--exit-with-session
122 進程的PID是:6729       進程的名稱是:/bin/dbus-daemon--fork--print-pid5--print-address7--session
123 進程的PID是:6731       進程的名稱是:/usr/bin/gnome-session--autostart=/usr/share/gdm/autostart/LoginWindow/
124 進程的PID是:6734       進程的名稱是:/usr/libexec/gconfd-2
125 進程的PID是:6735       進程的名稱是:/usr/libexec/at-spi-registryd
126 進程的PID是:6739       進程的名稱是:/usr/libexec/gnome-settings-daemon--gconf-prefix=/apps/gdm/simple-greeter/settings-manager-plugins
127 進程的PID是:6741       進程的名稱是:/usr/libexec/bonobo-activation-server--ac-activate--ior-output-fd=12
128 進程的PID是:6749       進程的名稱是:/usr/libexec/gvfsd
129 進程的PID是:6750       進程的名稱是:metacity
130 進程的PID是:6753       進程的名稱是:/usr/libexec/gdm-simple-greeter
131 進程的PID是:6755       進程的名稱是:gnome-power-manager
132 進程的PID是:6756       進程的名稱是:/usr/libexec/polkit-gnome-authentication-agent-1
133 進程的PID是:6758       進程的名稱是:plymouth-log-viewer--icon
134 進程的PID是:6775       進程的名稱是:/usr/bin/pulseaudio--start--log-target=syslog
135 進程的PID是:6778       進程的名稱是:pam: gdm-password
136 進程的PID是:7343       進程的名稱是:sshd: root@pts/0
137 進程的PID是:7350       進程的名稱是:-bash
138 進程的PID是:7797       進程的名稱是:viuppercase.go
139 進程的PID是:8579       進程的名稱是:pickup-l-tfifo-u
140 進程的PID是:8898       進程的名稱是:/usr/sbin/anacron-s
141 進程的PID是:8904       進程的名稱是:sshd: root@pts/2
142 進程的PID是:8911       進程的名稱是:-bash
143 進程的PID是:9075       進程的名稱是:vips.go
144 進程的PID是:9082       進程的名稱是:sshd: root@pts/3
145 進程的PID是:9089       進程的名稱是:-bash
146 進程的PID是:9300       進程的名稱是:gorunps.go/proc/
147 進程的PID是:9318       進程的名稱是:/tmp/go-build752959693/command-line-arguments/_obj/exe/ps/proc/
148 [root@yinzhengjie day3]#
程序用法展示

   對了,再給大家推薦一個Golang的官方文檔鏈接:http://godoc.org/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM