func main() {
go func() {
pingHttp("https://www.qq.com/")
pingHttp("https://www.baidu.com/")
pingHttp("https://www.bing.com/")
}()
}
//ping网址
func pingHttp(url string) {
// 获取状态码
client := resty.New()
resp, err := client.R().Get(url)
if err != nil {
fmt.Println(err)
}
//获取状态码
fmt.Println("Status Code:", resp.StatusCode())
//获取文件大小
fmt.Println("Size:", resp.Size())
//获取文件返回的源代码
fmt.Println(resp)
}
运行之后出现无打印效果,我记得有输出打印呀,后来发现,因为我使用了go的异步请求,程序结束了,异步请求再去获取数据已经晚了,所以我进行了修改
修正问题1不适用golang同步就像以下这么改
func main() {
webArr := []string{"https://www.qq.com/", "https://www.php-china.com/", "https://www.so.com/?src=so.com", "https://www.sogou.com/", "https://www.baidu.com/", "https://www.bing.com/"}
// wg.Add(len(webArr))
for i := 0; i < len(webArr); i++ {
go func(url string) {
pingHttp(url)
}(webArr[i])
}
// wg.Wait()
sig := make(chan os.Signal)
signal.Notify(sig, os.Interrupt, os.Kill)
<-sig
}
//ping网址
func pingHttp(url string) {
// 获取状态码
client := resty.New()
resp, err := client.R().EnableTrace().SetHeader("Range", "bytes=0-1023").Get(url)
if err != nil {
fmt.Println(err)
}
fmt.Println("Status Code:", resp.StatusCode()) //返回的状态码
fmt.Println("Size:", resp.Size()) //大小
fmt.Println("Time:", resp.Time()) //加载速度
fmt.Println("url:", url) //访问的路径
// fmt.Println(resp)
// wg.Done()
}
func main() {
webArr := []string{"https://www.qq.com/", "https://www.baidu.com/", "https://www.bing.com/", "https://www.php-china.com/"}
wg.Add(len(webArr))
go func(webArr []string) {
for i := 0; i < len(webArr); i++ {
pingHttp(webArr[i])
}
}(webArr)
// wg.Wait()
sig := make(chan os.Signal)
signal.Notify(sig, os.Interrupt, os.Kill)
<-sig
}
//ping网址
func pingHttp(url string) {
// 获取状态码
client := resty.New()
resp, err := client.R().EnableTrace().SetHeader("Range", "bytes=0-1023").Get(url)
if err != nil {
fmt.Println(err)
}
fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Size:", resp.Size())
wg.Done()
}
问题2
如果我要ping这些网站,输出内容,就会出现中文乱码,何时出现中文乱码,都需要我进行判断,所以我需要判断编码格式,然后再编码转换。同时使用resty请求的一些技巧和设置
不错的resty介绍网址
https://www.cnblogs.com/jiujuan/p/14583605.html
type Charset string
const (
UTF8 = Charset("UTF-8")
GB18030 = Charset("GB18030")
UNKNOWN = Charset("UNKNOWN")
)
func main() {
webArr := []string{"https://www.bing.com/", "https://www.qq.com/", "https://www.php-china.com/", "https://www.so.com/?src=so.com", "https://www.sogou.com/", "https://www.baidu.com/"}
// wg.Add(len(webArr))
for i := 0; i < len(webArr); i++ {
go func(url string) {
pingHttp(url)
}(webArr[i])
}
// wg.Wait()
sig := make(chan os.Signal)
signal.Notify(sig, os.Interrupt, os.Kill)
<-sig
}
//ping网址
func pingHttp(url string) {
// 获取状态码
client := resty.New()
//ForceContentType强制让resty按照特定的格式来解析响应
//EnableTrace()方法启用 trace。启用 trace 可以记录请求的每一步的耗时和其他信息
resp, err := client.R().EnableTrace().ForceContentType("application/json").Get(url)
if err != nil {
fmt.Println(err)
}
fmt.Println("Status Code:", resp.StatusCode()) //返回的状态码
fmt.Println("Size:", resp.Size()) //大小
fmt.Println("Time:", resp.Time()) //加载速度
fmt.Println("url:", url) //访问的路径
coding := GetStrCoding([]byte(resp.String()))
res := ConvertByte2String([]byte(resp.String()), coding)
fmt.Println(res)
}
//内容编码格式转换
func ConvertByte2String(byte []byte, charset Charset) string {
var str string
switch charset {
case GB18030:
var decodeBytes, _ = simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
str = string(decodeBytes)
case UTF8:
fallthrough
default:
str = string(byte)
}
return str
}
func preNUm(data byte) int {
var mask byte = 0x80
var num int = 0
//8bit中首个0bit前有多少个1bits
for i := 0; i < 8; i++ {
if (data & mask) == mask {
num++
mask = mask >> 1
} else {
break
}
}
return num
}
//判断内容编码格式
func GetStrCoding(data []byte) Charset {
if isUtf8(data) == true {
return UTF8
} else if isGBK(data) == true {
return GB18030
} else {
return UNKNOWN
}
}
//判断是否为中文编码
func isGBK(data []byte) bool {
length := len(data)
var i int = 0
for i < length {
if data[i] <= 0x7f {
//编码0~127,只有一个字节的编码,兼容ASCII码
i++
continue
} else {
//大于127的使用双字节编码,落在gbk编码范围内的字符
if data[i] >= 0x81 &&
data[i] <= 0xfe &&
data[i+1] >= 0x40 &&
data[i+1] <= 0xfe &&
data[i+1] != 0xf7 {
i += 2
continue
} else {
return false
}
}
}
return true
}
//判断是否为utf-8编码
func isUtf8(data []byte) bool {
i := 0
for i < len(data) {
if (data[i] & 0x80) == 0x00 {
// 0XXX_XXXX
i++
continue
} else if num := preNUm(data[i]); num > 2 {
// preNUm() 返回首个字节的8个bits中首个0bit前面1bit的个数,该数量也是该字符所使用的字节数
i++
for j := 0; j < num-1; j++ {
//判断后面的 num - 1 个字节是不是都是10开头
if (data[i] & 0xc0) != 0x80 {
return false
}
i++
}
} else {
//其他情况说明不是utf-8
return false
}
}
return true
}
个人网站:https://www.php-china.com/
如有错误,请多多指教。
如对你有帮助,给个赞吧。