前些日子参加了一个叫Advent of Code的编程大赛,每天一道题,快活似神仙。这每道题都有自己的拼图数据输入puzzle input,要做题就需要用到该数据,把数据复制过来感觉又太麻烦,于是就兴起写了一个直接从html读取数据的函数。

数据如下:

+12
-10
-4
-8
+18
-1
-13
...

查看标准库文档,发现net/html包可以做这个功能,其函数如下:

resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...

然后调试,但并未有相关数据输出,在浏览器中检查元素发现该请求需要带cookie才能正确返回数据。直接使用http.Get()并不带有cookie,所以改用NewRequest使用指定的方法、网址和可选的主题创建并返回一个新的*Request。其函数如下:

client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Cookie", "name=value")
resp, err := client.Do(req) robots, err := ioutil.ReadAll(resp.Body) resp.Body.Close()//必须要关闭Body

ioutil.ReadAll()返回的是[]byte类型,入需要使用可以先将[]byte转换成string,Go语言初学者都会的类型转换语法:string(b),Go为了稳定性对于上述方法需要经过一些数据上的复制,一旦数据量过大,这个成本是难以忍受的。

所以为了让Go服帖,我们得用上unsafe包,unsafe包提供一些可以跳过Go语言类型安全限制的操作。看下面代码:

func BytesString(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}

我们取到[]byte的指针,Go会说*byte不是*string,但是我们有外挂unsafe.Pointer,所以Go就通过了,接着你很自在的把*byte转成了*string,因为reflect.StringHeaderreflect.SliceHeader的结构体只相差末尾一个字段。

类似的用法可以看Go语言黑魔法

接着用regexp包正则表达式FindAllString取出匹配的[]string数据使用,然后再用strconv.Atoi()进行转化就可以了。

Day1的题为求和,其代码如下:

package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"regexp"
"strconv"
"unsafe"
)
func BytesString(b []byte) string {//[]byte 转string
return *(*string)(unsafe.Pointer(&b))
}
func getPuzzle(url string) string {//从网页抓取数据
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Cookie", "session=53616c7xxx")
resp, err := client.Do(req)
robots, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
str := BytesString(robots)
return str
}
func sum(num []int) int {
sum := 0
for _, n := range num {
sum += n
}
return sum
}
func strtoint(str []string) []int {//string转int
num := make([]int, len(str))
for i := 0; i < len(str); i++ {
flag := str[i][0]
chafre, _ := strconv.Atoi(str[i][1:])
switch flag {
case '+':
num[i] = chafre
case '-':
num[i] = -chafre
}
}
return num
}
func main() {
change := getPuzzle("https://adventofcode.com/2018/day/1/input")
re := regexp.MustCompile("[+|-][0-9]*")//正则表达式
str := re.FindAllString(change, -1)
num := strtoint(str)
sum := sum(num)
fmt.Printf("sum is %d\n", sum)
}

如果有更好的方法,欢迎私信,哈哈哈···

go语言带cookie的net客户端请求与[]byte转string的更多相关文章

  1. 【HTTP header】【Access-Control-Allow-Credentials】跨域Ajax请求时是否带Cookie的设置

    1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...

  2. 跨域Ajax请求时是否带Cookie的设置

    1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...

  3. postman发送带cookie的http请求

    1:需求:测试接口的访问权限,对于某些接口A可以访问,B不能访问. 2:问题:对于get请求很简单,登录之后,直接使用浏览器访问就可以: 对于post请求的怎么测试呢?前提是需要登录态,才能访问接口. ...

  4. postman 请求带cookie

    以亚马逊为例,我抓包随便看一个返回是json数据格式的一个接口,比如随便点一个,我的订单 随便找一条,然后复制url过滤 右键,copy下url 将url放入filter过滤: 在postman里面, ...

  5. urllib2 post请求方式,带cookie,添加请求头

    #encoding = utf-8 import urllib2import urllib url = 'http://httpbin.org/post'data={"name": ...

  6. PostMan 使用Interceptor 发送带cookie的请求一直loading

    问题 最近要写一个爬虫(虽然是第一次写),于是就用了Chrome上非常方便一个插件,PostMan,但是由于chrome安全的限制,发不出带cookie和带有自定义头部标签的请求. 百度一番后得如果想 ...

  7. HTTPClient实现免登陆请求(带cookie请求)

    背景: 使用httpClient请求某登录型网站,模拟一个操作,一般步骤一个httpclient模式登录->httpClient模拟操作: 此时发现,每次操作都需要进行一次登录,极其浪费时间,是 ...

  8. 带cookie请求数据

    经常会用到一些采集网上的资源,普通网站很好采,get_file_contents()/c_url(). 有的网站会有登陆后才能采集,需要带cookie请求获取(登陆网站相同方法),下面记录一下使用方法 ...

  9. 使用Postman Interceptor发送带cookie的请求一直loading的解决法案

    很多web网页开发人员都知道Postman限制由于chrome安全的限制,发不出带cookie和带有自定义头部标签的请求.想要发出由于chrome安全的限制,发不出带cookie和带有自定义头部标签的 ...

随机推荐

  1. 89C51单片机的学习

    好久都没来写一些东西了 最近老是忙着玩了,都忘记认真学习了. 大概从明天开始就要开始忙了. 1,英语四级 2,单片机课程 3,安卓课程 4,PS 感觉事情好多. 但是我还是心不在焉.好奇怪. 反正就是 ...

  2. 天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测

    作为天池上的新手,第一次参加天池阿里云线上的比赛,糖尿病预测, 一般的数据挖掘比赛,流程:数据清洗,特征工程(找特征,特征组合),不断的尝试的不同算法,不断调参,也可以考虑将多个模型进行线性组合 大赛 ...

  3. 利用cobbler无人值守批量安装centos

    准备: 至少两台机器,分别用作cobbler的服务端和安装测试端 准备一个iso的安装文件,最好是4G多的那个dvd包,以前用网易源上那个centos 6.4 x86_64 通过xen安装时就报错:N ...

  4. [零基础学JAVA]Java SE面向对象部分.面向对象基础(04)

     2.代码块 1.内部类 3.链表 2.代码块: 1.) 普通代码块. 2.)静态代码块. 3.)构造代码块. 4.)同步代码块. class Test{//构造块    {        Syste ...

  5. jwplayer视频--不兼容IE8

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. Odoo中的逆计算——由compute字段的值逆向修改其依赖值

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281406.html 当通过compute属性指定方法,根据依赖值计算得到当前字段值时.一般也要制定这个计算的 ...

  7. VC++使用socket进行TCP、UDP通信实例总结

    1.        两台计算机通信需要协议,通信的两台计算机IP必须唯一 2.        同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一 ...

  8. 切换ubuntu-18.04启动方式

    默认命令行形式启动 sudo systemctl set-default multi-user.target reboot 临时使用一次图形界面进入 sudo systemctl start ligh ...

  9. 《AngularJS即学即用》读书笔记(一)

    最近在学习angularJS,就买了一本<AngularJS即学即用>作为自己的入门书籍,到目前为止看了两章的内容,感觉这本书还是不错的,东西讲的浅显易懂.之所以写这篇文章,一是督促自己能 ...

  10. ASP.Net GridView 基础 Template模板

    一.了解Template AlternatingItemTemplate定义交替行的内容和外观,如果没有规定模板,则使用ItemTemplate:EditItemTemplate定义当前正在编辑的行的 ...