内容方面比教科书较实用多了,主流要用的知识都有介绍,实例代码准确性搞。但是需要有一定基础开发基础,如c\python\java。否则学习起来有难度。
golang使用参数
备忘
package main
import (“fmt”
“flag”
)
//参数名, 参数默认值,参数说明
var (loopnum =flag.Int(“l”,10,”loop num.”)
loopurl =flag.String(“u”,”www.simonzhang.net”,”get url.”)
)
func main() {
flag.Parse()
fmt.Println(“loop num:”, loopnum)
fmt.Println(“url:”, *loopurl)
}
编译后使用
flag -l=11 -u=http://www.simonzhang.net
go语言的程序跑在android上
之前写了一个检查页面的golang程序http://www.simonzhang.net/?p=1346。就用这个测试一下放到android上看看效果如何。但是我在windows上的golang还是产生不了5g。我就直接到linux上编译,但是linux上使用adb又不方便,只能是编译后在转到windows上测试。好在我的linux是跑在虚拟机上,处理起来还算方便。为了编译和测试方便,我又编译了一个androidgo放在/usr/local/下,在搞个用户把环境变量配成arm的。也可以直接CGO_ENABLED=0 GOOS=linux GOARCH=arm go build android-check-url.go 编译,就不用这么麻烦了。
开始,还是用之前的代码没有进行修改。开始进行编译。代码从http://www.simonzhang.net/?p=1346里拷贝。
# go tool 5g android-checl-url
# go tool 5l android-check-url.5
# mv 5.out android-check-url
图a
将编译好的大文件(2.7M)放到E:盘中。然后放到手机上测试。
>adb push E:\android-check-url /data/local
>adb push E:\url.txt /data/local
>adb shell
#cd /data/local
#chmod 755 android-check-url
#./android-check-url
出错了
Get http://www.simonzhang.net: error reading DNS config: open /etc/resolv.conf: no such file or directory
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x20 pc=0x11174]
goroutine 1 [running]:
main.main()
/root/android-go/android-check-url.go:31 +0x574
goroutine 2 [syscall]:
created by runtime.main
/usr/local/go/src/pkg/runtime/proc.c:221
#
图b
报错显示找不到dns的配置文件。很是奇怪那现在的程序是怎么解析的。这个先不搞清楚了,先手动建个dns的配置文件,只用google的dns进行解析(这个操作也是参考一个国外的帖子,但是浏览器不小心关掉了所以不能贴出地址)。
图c
再次进入手机运行程序。运行成功
图d
golang 批量检查页面
在学习go语言,所以当前的需求使用go来试验一下。需要:循环检查某些url并返值,并获取所用时间,如果返回内容长度超过100个字节,只显示前100个字节,不足100个字节显示全部。我将url写在url.txt文件中,方便以后增加。
在centos 5.4下go1.0.2编译通过。虽然编译通过,但是个人感觉还是不如python方便,并且变异出来的东西都快3M了,让我想起了当年的delphi。如果这种监测实验脚本还是首选python。但是用python做有个问题,如果使用“while 1”循环使用urllib2获取,时间一长就失败过多。具体原因没有查,直接用crontab或脚本调用解决。
package main import ("fmt" "os" "net/http" "io/ioutil" "time" ) func main() { var str string userFile := "url.txt" fin,err := os.Open(userFile) defer fin.Close() if err != nil { fmt.Println(userFile,err) return } buf := make([]byte, 1) // for{ n,_:= fin.Read(buf) if 0==n {break} if string(buf)=="\n"{ //开始通过url获得页面 starttime:=time.Now().Unix() res, err := http.Get(str) endtime:=time.Now().Unix() usetime:=endtime-starttime if err != nil { fmt.Println(err) } context, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) } res.Body.Close() // 获得完毕打印 if len(context) >100{ fmt.Println(string(context)[:100]) } else { fmt.Println(string(context)) } fmt.Println("get url:", str, " use time :", usetime) str="" } else { str+=string(buf) } } }
golang 运行系统命令
在linux下测试通过
package main import ( "os/exec"; "fmt"; "bytes"; ) func main(){ cmd:=exec.Command("/bin/ls","-l","/") var out bytes.Buffer cmd.Stdout=&out err:=cmd.Run() if (err!=nil){ fmt.Println("failed.")} fmt.Println(out.String()) }