golang插入字符串_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 :yinzhengjie4 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.com6 */

7

8 '''

9 [root@yinzhengjie day3]# more myint.go10 package main11

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 int1622 d int32 //取值个数:2^32,取值范围:(-2^16)-(2^16-1)23 e int6424 x uint //其中这个"u",即:unsigned。表示无符号,即只能表示0和所有的正整数。25 y uint826 z uint1627 p uint32 //取之个数:2^32,取之范围0-2^32-128 q uint6429 )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.go44 A= 0 size= 845 B= 0 size= 146 C= 0 size= 247 D= 0 size= 448 E= 0 size= 849 X= 0 size= 850 Y= 0 size= 151 Z= 0 size= 252 P= 0 size= 453 Q= 0 size= 854 [root@yinzhengjie day3]#55

56 '''

2.常量(关键字:const )的定义

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8 package main9

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 GREEN23 BLUE24 )25

26 func main() {27 fmt.Println(RED,GREEN,BLUE)28 var (29 n int30 f float3231 f_1 float3232 )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 int6443 n2 int844 )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 :yinzhengjie4 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.com6 */

7

8 package main9

10 import(11 "fmt"

12 "strconv"

13 "reflect"

14 )15

16

17 func main() {18

19 var (20 s string21 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 转换前的类型 int33 我是转换后的字符串: 100

34 转换后的类型 string

5.生成随机字符串案例

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8 //世界上只有10种人,一种是懂二进制,一种是不懂二进制。9 package main10

11 import(12 "math/rand"

13 "time"

14 "strconv"

15 "fmt"

16 )17

18 var x int6419 var s string20

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 :yinzhengjie4 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.com6 */

7

8 '''

9 [root@yinzhengjie day3]# more str_note.go10 package main11

12 import (13 "fmt"14 )15

16 func main() {17 str1 := "yinzhengjie\thave a apple!" //"\t"表示制表符,会根据操作系统自动空出几个空格。18 doc :=` //定义多行注释19 11120 22221 333322 `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 pen36 I have an apple37 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 11145 22246 333347

48 hello\world49 您好,尹正杰!50 ####222251 [root@yinzhengjie day3]#52

53 '''

2.字符串操作

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8 '''

9 [root@yinzhengjie day3]# more str_manipulation.go10 package main11

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 = uint830 str2 = str1[0] //取字符31 fmt.Println(str2)32 fmt.Printf("数字:%d 字符:%c\n",str2,str2) //表示字符"y"在ASCII表中对应的数字。printf不会换行但是prin33 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 mainimport("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 hello121uint8*/

4.提升逼格的linux命令

这个知识点大家可以不看,如果对linux不感兴趣的话,可以直接跳过,直接看下面的小试牛刀。如果你看到了一堆“10”你会想到是什么呢?在不眼里可能就是一个数字“10”,但是在一些程序员或者说在黑客眼里,这个“10”是2个数字,即“1”和“0”,是二进制的两个数字。在unix操作系统中,包括所有的Linux发现版本和mac都是可以用一个命令来查看文件内容的,他能把文件中的内容翻译成“1001010”类似这种的代码,也是一些开发人员的装逼利器:“xxd”,如果用这个命令呢?展示方法如下:

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8 '''

9 [root@yinzhengjie day3]# xxd str_manipulation.go10 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 := "yinz24 00000e0: 6865 6e67 6a69 6522 202b 2022 776f 726c hengjie" + "worl25 00000f0: 6422 202f 2fe6 8bbc e68e a50a 0966 6d74 d" //........fmt26 0000100: 2e50 7269 6e74 6c6e 2873 7472 3129 0a0a .Println(str1)..27 0000110: 0976 6172 2020 7374 7232 2062 7974 6520 .var str2 byte28 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 = u32 0000160: 696e 7438 0a09 7374 7232 203d 2073 7472 int8..str2 = str33 0000170: 315b 305d 202f 2fe5 8f96 e5ad 97e7 aca6 1[0] //.........34 0000180: 0a09 666d 742e 5072 696e 746c 6e28 7374 ..fmt.Println(st35 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",str238 00001c0: 2c73 7472 3229 202f 2fe8 a1a8 e7a4 bae5 ,str2) //.......39 00001d0: ad97 e7ac a622 7922 e59c a841 5343 4949 ....."y"...ASCII40 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 ............str345 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-148 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.Pr54 00002c0: 696e 746c 6e28 7374 7233 290a 0a09 7374 intln(str3)...st55 00002d0: 7234 203a 3d20 7374 7231 5b31 313a 6c65 r4 := str1[11:le56 00002e0: 6e28 7374 7231 295d 0a09 666d 742e 5072 n(str1)]..fmt.Pr57 00002f0: 696e 746c 6e28 7374 7234 290a 0a09 7661 intln(str4)...va58 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......b61 0000330: 7974 65ef bc8c e585 b6e5 ae9e e698 afe7 yte.............62 0000340: ad89 e695 88e7 9a84 e380 820a 0966 6f72 .............for63 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.Pri65 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......l72 00003e0: 6973 742e 0a09 666d 742e 5072 696e 746c ist...fmt.Printl73 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 = stri79 0000450: 6e67 2861 7272 6179 290a 0966 6d74 2e50 ng(array)..fmt.P80 0000460: 7269 6e74 6c6e 2873 7472 3129 0a0a 0966 rintln(str1)...f81 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 ...........ASCII85 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(0xa89 00004f0: 2920 2f2f e8a1 a8e7 a4ba 3136 e8bf 9be5 ) //......16....90 0000500: 88b6 e695 b0e5 ad97 61e5 9ca8 4153 4349 ........a...ASCI91 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 :yinzhengjie4 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.com6 */

7

8 '''

9 [root@yinzhengjie day3]# more uppercase.go10 package main11

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 int22 res string23 )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 res31 }32 [root@yinzhengjie day3]#33 [root@yinzhengjie day3]#34 [root@yinzhengjie day3]# go run uppercase.go //实现结果如下35 YINZHENGJIEE36 [root@yinzhengjie day3]#37 '''

以上代码你看起来可能特别简单,而且思路不严谨,没有判断字母大小写就同意转换成大写的操作!那么如何优化呢?请看下面的代码,稍微做了一下优化的代码风格就有所改变。

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8 '''

9 [root@yinzhengjie day3]# more lower_upper.go10 package main11

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.go32 YINZHENGJIE33 [root@yinzhengjie day3]#34 '''

B.用Golang语言试下将字母的顺序颠倒,专业术语叫反转。

在写这个小程序之前我们需要了解一下rune这个包,大家都知道byte,众所周知的字节,一个字节等于八个比特位,一个比特位存着响应的字母或是数字以及一些特殊符号等等,但是存取中国的汉字一个字节是远远不够的,可能用到三到四个字节进行存取的,所以我们之前将字母小写转换成大写就不好使了。因为你会发现自己是取不到下表的,一个汉字需要三个字节存取,你想读取汉字的时候必须也得取三个字节才能读到这个汉字,如果只取一个字节的话就会乱码。当然知道这个原理后我用byte也实现了反转的功能,但是真的太麻烦了(随着汉字的数量不同,我得判断字节循环的起点数量)。我找到了rune这个包,真的很好使,话不多说,我们直接上代码对比一下输出结果您就清楚了。代码请点击下面的小标题。

1 package main2

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'的数据类型吧: []uint857 让我们来一起看看'rune'的数据类型吧: []int32

对比string,byte,rune存取汉字的方式

姿势一:用rune实现将字符倒着打印即可完成反转功能

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8 package main9

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 :yinzhengjie4 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.com6 */

7

8 package main9

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 :yinzhengjie4 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.com6 */

7

8

9 package main10

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

27

28

29 #以上代码执行结果如下:

30 你迎欢京北

相比通过这个小程序,发现Golang的for循环很好玩吧。下面跟着我一起来学习一下Golang的for循环吧。

三.循环语句

说道循环,那Golang里面的姿势可多了,得给你涨涨经验了,光我所知道的就有4种,别问我最喜欢那种姿势,这个你得用手去感受,用心去体会,别想歪啊,我是说用手去敲代码感受,用心去研究那种循环的姿势最适合你。话不多收我们开干吧!

1.姿势一:这种循环玩shell的童鞋一看便知。

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8 package main9

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 027 1

28 2

29 3

30 4

31 5

2.姿势二:类似python中的while循环

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8 package main9

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 :yinzhengjie4 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.com6 */

7

8 package main9

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 :yinzhengjie4 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.com6 */

7

8 package main9

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 3正29 6杰30 9 2

31 10032 11 1

33 12 7

四.条件判断

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8 package main9

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 :yinzhengjie5 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.com7 */

8

9 package main10

11 import(12 "fmt"

13 "os"

14 "strconv"

15 )16

17 func main() {18 var (19 x int20 y int21 //res int22 )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 :yinzhengjie4 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.com6 */

7

8 package main9

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 :yinzhengjie4 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.com6 */

7

8 package main9

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) //表示最佳的方式打开文件,如果不存在就创建,打开的模式是可读可写,权限是64418 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 :yinzhengjie4 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.com6 */

7

8 package main9

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 :yinzhengjie4 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.com6 */

7

8

9 package main10

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$$$hengjie41 yinzhengjie

B>.随机读取文件内容

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8

9 package main10

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 :yinzhengjie4 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.com6 */

7

8 package main9

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 Successive28 calls to the Scan method will step through the tokens of a file skipping the bytes between the tokens The specification29 of a token isdefined by a split function of type SplitFunc the default split function breaks the input into lines with30 line termination stripped Split functions are defined in this package for scanning a file into lines bytes UTF-8-encoded31 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 :yinzhengjie4 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.com6 */

7

8

9 package main10

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

用Golang将九九乘法表写入到文件中

1 /*

2 #!/usr/bin/env gorun

3 @author :yinzhengjie4 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.com6 */

7

8

9 package main10

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 :yinzhengjie5 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.com7 */

8

9 package main10

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.go31 是否为目录:%!V(bool=false) ;文件或者目录大小:708;目录名称是:myexpr.go32 是否为目录:%!V(bool=false) ;文件或者目录大小:641;目录名称是:ls.go33 [root@yinzhengjie day3]#go run ls.go ~/

34 是否为目录:%!V(bool=false) ;文件或者目录大小:1498;目录名称是:.viminfo35 是否为目录:%!V(bool=false) ;文件或者目录大小:324;目录名称是:.bash_profile36 是否为目录:%!V(bool=true) ;文件或者目录大小:4096;目录名称是:.pki37 是否为目录:%!V(bool=false) ;文件或者目录大小:129;目录名称是:.tcshrc38 是否为目录:%!V(bool=false) ;文件或者目录大小:12288;目录名称是:.bash_profile.swp39 是否为目录:%!V(bool=false) ;文件或者目录大小:12790;目录名称是:.bash_history40 是否为目录:%!V(bool=false) ;文件或者目录大小:18;目录名称是:.bash_logout41 是否为目录:%!V(bool=false) ;文件或者目录大小:2856;目录名称是:anaconda-ks.cfg42 是否为目录:%!V(bool=false) ;文件或者目录大小:56;目录名称是:.gitconfig43 是否为目录:%!V(bool=false) ;文件或者目录大小:176;目录名称是:.bashrc44 是否为目录:%!V(bool=true) ;文件或者目录大小:4096;目录名称是:.ssh45 是否为目录:%!V(bool=false) ;文件或者目录大小:12480;目录名称是:install.log46 是否为目录:%!V(bool=false) ;文件或者目录大小:4088;目录名称是:install.log.syslog47 是否为目录:%!V(bool=false) ;文件或者目录大小:100;目录名称是:.cshrc48 [root@yinzhengjie day3]#

49 [root@yinzhengjie day3]#go run ls.go /tmp/

50 是否为目录:%!V(bool=true) ;文件或者目录大小:4096;目录名称是:go-build65574889751 是否为目录:%!V(bool=false) ;文件或者目录大小:1092;目录名称是:ks-script-ddWzzz52 是否为目录:%!V(bool=true) ;文件或者目录大小:4096;目录名称是:cactiez53 是否为目录:%!V(bool=false) ;文件或者目录大小:0;目录名称是:ks-script-ddWzzz.log54 是否为目录:%!V(bool=true) ;文件或者目录大小:4096;目录名称是:go-build55151412455 是否为目录:%!V(bool=true) ;文件或者目录大小:4096;目录名称是:.ICE-unix56 是否为目录:%!V(bool=false) ;文件或者目录大小:52475;目录名称是:ins.log57 是否为目录:%!V(bool=false) ;文件或者目录大小:0;目录名称是:yum.log58 [root@yinzhengjie day3]#

C>.模拟操作系统中的ps基础功能命令;

1 [root@yinzhengjie day3]# more ps.go2 /*

3 #!/usr/bin/env gorun4 @author :yinzhengjie5 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.com7 */

8

9

10 package main11

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 continue37 }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 :yinzhengjie4 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.com6 */

7

8 package main9

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 string20 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 string36 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/init5 我天,这个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-d66 我天,这个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-fuse71 进程的PID是:1338 进程的名称是:/usr/sbin/vmtoolsd72 进程的PID是:1363 进程的名称是:/usr/lib/vmware-vgauth/VGAuthService-s73 进程的PID是:1423 进程的名称是:./ManagementAgentHost74 进程的PID是:1619进程的名称是:auditd75 进程的PID是:1641 进程的名称是:/sbin/portreserve76 进程的PID是:1649 进程的名称是:/sbin/rsyslogd-i/var/run/syslogd.pid-c577 进程的PID是:1679 进程的名称是:irqbalance--pid=/var/run/irqbalance.pid78 进程的PID是:1695进程的名称是:rpcbind79 进程的PID是:1740 进程的名称是:dbus-daemon--system80 进程的PID是:1753 进程的名称是:NetworkManager--pid-file=/var/run/NetworkManager/NetworkManager.pid81 进程的PID是:1758 进程的名称是:/usr/sbin/modem-manager82 进程的PID是:1774进程的名称是:rpc.statd83 进程的PID是:1810 进程的名称是:cupsd-C/etc/cups/cupsd.conf84 进程的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.pid85 进程的PID是:1855 进程的名称是:/usr/sbin/acpid86 进程的PID是:1865进程的名称是:hald87 进程的PID是:1866 进程的名称是:hald-runner88 进程的PID是:1911 进程的名称是:hald-addon-input: Listening on /dev/input/event0 /dev/input/event289 进程的PID是:1917 进程的名称是:hald-addon-acpi: listening on acpid socket /var/run/acpid.socket90 进程的PID是:1943 进程的名称是:/usr/sbin/sshd91 进程的PID是:1953 进程的名称是:xinetd-stayalive-pidfile/var/run/xinetd.pid92 进程的PID是:2112 进程的名称是:/usr/libexec/postfix/master93 进程的PID是:2133 进程的名称是:qmgr-l-tfifo-u94 进程的PID是:2140 进程的名称是:/usr/sbin/abrtd95 进程的PID是:2151进程的名称是:crond96 进程的PID是:2165 进程的名称是:/usr/sbin/atd97 进程的PID是:2178 进程的名称是:/usr/sbin/cimserver98 进程的PID是:2204 进程的名称是:/sbin/mingetty/dev/tty299 进程的PID是:2206 进程的名称是:/sbin/mingetty/dev/tty3100 进程的PID是:2208 进程的名称是:/sbin/mingetty/dev/tty4101 进程的PID是:2210 进程的名称是:/sbin/mingetty/dev/tty5102 进程的PID是:2212 进程的名称是:/sbin/mingetty/dev/tty6103 进程的PID是:2251 进程的名称是:/usr/sbin/console-kit-daemon--no-daemon104 进程的PID是:2327 进程的名称是:/usr/libexec/devkit-power-daemon105 进程的PID是:2379 进程的名称是:/usr/libexec/polkit-1/polkitd106 进程的PID是:2392 进程的名称是:/usr/libexec/rtkit-daemon107 进程的PID是:2513 进程的名称是:/usr/libexec/udisks-daemon108 进程的PID是:2515 进程的名称是:udisks-daemon: polling /dev/sr0109 进程的PID是:2578 进程的名称是:/usr/sbin/restorecond-u110 我天,这个PID进程是属于系统的BASH的哟!111 我天,这个PID进程是属于系统的BASH的哟!112 进程的PID是:3333 进程的名称是:/sbin/dmeventd113 我天,这个PID进程是属于系统的BASH的哟!114 我天,这个PID进程是属于系统的BASH的哟!115 进程的PID是:3581 进程的名称是:/sbin/udevd-d116 进程的PID是:3582 进程的名称是:/sbin/udevd-d117 进程的PID是:6520 进程的名称是:/sbin/mingetty/dev/tty1118 进程的PID是:6689 进程的名称是:/usr/sbin/gdm-binary-nodaemon119 进程的PID是:6704 进程的名称是:/usr/libexec/gdm-simple-slave--display-id/org/gnome/DisplayManager/Display1120 进程的PID是:6707 进程的名称是:/usr/bin/Xorg:0-br-verbose-audit4-auth/var/run/gdm/auth-for-gdm-IfKotc/database-nolistentcpvt1121 进程的PID是:6728 进程的名称是:/usr/bin/dbus-launch--exit-with-session122 进程的PID是:6729 进程的名称是:/bin/dbus-daemon--fork--print-pid5--print-address7--session123 进程的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-registryd126 进程的PID是:6739 进程的名称是:/usr/libexec/gnome-settings-daemon--gconf-prefix=/apps/gdm/simple-greeter/settings-manager-plugins127 进程的PID是:6741 进程的名称是:/usr/libexec/bonobo-activation-server--ac-activate--ior-output-fd=12

128 进程的PID是:6749 进程的名称是:/usr/libexec/gvfsd129 进程的PID是:6750进程的名称是:metacity130 进程的PID是:6753 进程的名称是:/usr/libexec/gdm-simple-greeter131 进程的PID是:6755 进程的名称是:gnome-power-manager132 进程的PID是:6756 进程的名称是:/usr/libexec/polkit-gnome-authentication-agent-1

133 进程的PID是:6758 进程的名称是:plymouth-log-viewer--icon134 进程的PID是:6775 进程的名称是:/usr/bin/pulseaudio--start--log-target=syslog135 进程的PID是:6778 进程的名称是:pam: gdm-password136 进程的PID是:7343 进程的名称是:sshd: root@pts/0137 进程的PID是:7350 进程的名称是:-bash138 进程的PID是:7797进程的名称是:viuppercase.go139 进程的PID是:8579 进程的名称是:pickup-l-tfifo-u140 进程的PID是:8898 进程的名称是:/usr/sbin/anacron-s141 进程的PID是:8904 进程的名称是:sshd: root@pts/2

142 进程的PID是:8911 进程的名称是:-bash143 进程的PID是:9075进程的名称是:vips.go144 进程的PID是:9082 进程的名称是:sshd: root@pts/3

145 进程的PID是:9089 进程的名称是:-bash146 进程的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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值