短篇小说:如何比较两个 JSON 块?下面的代码出错了。
var j, j2 interface{}
b := []byte(srv.req)
if err := json.Unmarshal(b, j); err !=nil{
t.Errorf("err %v, req %s", err, b)
return
}
d := json.NewDecoder(r.Body)
if err := d.Decode(j2); err !=nil{
t.Error(err)
return
}
if !reflect.DeepEqual(j2, j){
t.Errorf("j %v, j2 %v", j, j2)
return
}
Run Code Online (Sandbox Code Playgroud)
长话短说:我正在做一些 E2E 测试,其中一部分我需要将请求的 JSON 正文与收到的 JSON 进行比较。为此,我尝试将预期的和收到的 json 解组到一个空接口(以避免任何类型错误),但我收到一个错误:
json: Unmarshal(nil). 我猜 encoding/json 不喜欢空接口,所以问题是如何比较两个 JSON 块?字符串比较容易出错,所以我试图避免这种情况。
如果存在连接/代理错误,我正在尝试重试请求.由于某些原因,我不断收到此错误,无论是否重试请求,都无法恢复:
Post https://m.somewebsite.co.uk/api/di/34433: http: ContentLength=222 with Body length 0
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我的第一个怀疑是http.Request以某种方式被消耗,因此在接下来的尝试中它不再是好的.我应该管理副本吗?
func Post(URL string, form url.Values, cl *http.Client) ([]byte, error) {
req, err := http.NewRequest("POST", URL, strings.NewReader(form.Encode()))
if err != nil {
log.Error(err)
return nil, err
}
req.Header.Set("User-Agent", ua)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
rsp, err := do(cl, req)
if err != nil {
return nil, err
}
defer rsp.Body.Close()
b, err := ioutil.ReadAll(rsp.Body)
if err != nil {
log.Error(err)
return nil, err
}
return b, nil
}
func do(cl *http.Client, req *http.Request)(*http.Response, error){ …Run Code Online (Sandbox Code Playgroud) 我想知道,是否可以通过 websockets 协议传输/隧道 TCP 连接?
有一个websockets 包,似乎我可以将 TCP 连接 io.copy 复制到 websockets 连接中,但我不知道如何在另一端将其重新组装为 TCPConn。
例如,我想在一端创建一个 socks5 ServerN(在 NAT 后面),在另一端创建一个 ServerIE。互联网用户会向 ServerIE 发出socks5 请求(通过socks5 协议),ServerIE 会通过websocket 连接将socks5 请求发送到ServerNAT。ServerNAT 然后将处理socks5 请求(即它是socks5 服务器)。
编辑:
我写了一些代码,但不幸的是它在从 TCP 连接读取到 WS 时卡住了。运行它:go run main.go -logtostderr
package main
import (
"flag"
log "github.com/golang/glog"
"golang.org/x/net/websocket"
"bufio"
"net"
"net/http"
"time"
// "io"
)
func main() {
flag.Parse()
defer log.Flush()
log.Infof("wsServer()")
wsCh := wsServer()
log.Infof("wsNAT()")
natWS, err := wsNAT()
if err != nil {
log.Error(err)
return
} …Run Code Online (Sandbox Code Playgroud) 可以检测到未使用的专用/未导出的功能.为什么编译器不会像未使用的变量那样抱怨?
编辑:该问题也适用于未使用的私有类型/接口.
我试图阻止一个例行公事,但我找不到实现这个目标的方法.我正在考虑使用第二个频道,但是如果我从中读取它会阻止它不是吗?这是一些代码,我希望解释我正在尝试做什么.
package main
import "fmt"
import "time"
func main() {
var tooLate bool
proCh := make(chan string)
go func() {
for {
fmt.Println("working")
//if is tooLate we stop/return it
if tooLate {
fmt.Println("stopped")
return
}
//processing some data and send the result on proCh
time.Sleep(2 * time.Second)
proCh <- "processed"
fmt.Println("done here")
}
}()
select {
case proc := <-proCh:
fmt.Println(proc)
case <-time.After(1 * time.Second):
// somehow send tooLate <- true
//so that we can stop the go routine running …Run Code Online (Sandbox Code Playgroud) 我正在尝试分析一个用go写的应用程序,它显然使用了大约256个虚拟内存(使用后检查ps aux).我正在尝试使用pprof包,看看哪些函数分配/消耗了大部分内存,但结果对我来说毫无意义.pprof top似乎只列出运行时函数.有人可以帮我理解这些数据吗?
ps aux |grep android
root 4584 3.4 0.1 500244 29536 pts/1 Sl+ 17:21 0:38 ./android -logtostderr
Run Code Online (Sandbox Code Playgroud)
go tool pprof http:// localhost:6060/debug/pprof/heap
/pprof.localhost:6060.inuse_objects.inuse_space.008.pb.gz
Entering interactive mode (type "help" for commands)
(pprof) top
512.19kB of 512.19kB total ( 100%)
Dropped 19 nodes (cum <= 2.56kB)
flat flat% sum% cum cum%
512.19kB 100% 100% 512.19kB 100% runtime.malg
0 0% 100% 512.19kB 100% runtime.mcommoninit
0 0% 100% 512.19kB 100% runtime.mpreinit
0 0% 100% 512.19kB 100% …Run Code Online (Sandbox Code Playgroud) 我正在从mysql数据库解析一些时间值,其中一些是零.为什么Go无法解析这个问题,我该如何解决?
checkTime := "0000-00-00 00:00:00"
t, err := time.Parse("2006-01-02 15:04:05", checkTime)
if err !=nil{
log.Errorf("err %v, checkTime %v, ID %v", err, checkTime, bk.ID)
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
err parsing time "0000-00-00 00:00:00": month out of range, checkin 0000-00-00 00:00:00
Run Code Online (Sandbox Code Playgroud) 我正在考虑打电话net.IP.String(), strings.Split(ip, ".")一些代码来计算所有角落的情况,最后net.ParseIP(s).有更好的方法吗?下面是我当前实现的代码(没有处理特殊情况).
package main
import (
"fmt"
"net"
"strconv"
"strings"
)
func main() {
ip := net.ParseIP("127.1.0.0")
next, err := NextIP(ip)
if err != nil {
panic(err)
}
fmt.Println(ip, next)
}
func NextIP(ip net.IP) (net.IP, error) {
s := ip.String()
sa := strings.Split(s, ".")
i, err := strconv.Atoi(sa[2])
if err != nil {
return nil, err
}
i++
sa[3] = strconv.Itoa(i)
s = strings.Join(sa, ".")
return net.ParseIP(s), nil
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试解析时间值(通过电子邮件收到),但我找不到应该使用的布局.
package main
import "fmt"
import "time"
func main() {
layout := "Mon, _2 Jan 2006 15:04:05 -0700 (MST-07:00)"
data := "Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)"
t, err := time.Parse(layout, data)
if err != nil {
panic(err)
}
fmt.Println(t)
}
Run Code Online (Sandbox Code Playgroud)
panic: parsing time "Mon, 5 Oct 2015 00:24:08 +0800 (GMT+08:00)" as "Mon, _2 Jan 2006 15:04:05 -0700 (MST-07:00)": cannot parse ":00)" as "-07:00"
我正在尝试使用标准的“fmt”包从 stdin 扫描一些命令
然而,似乎 scanf 在第一个空格后停止。知道我该如何解决吗?
var in string
for err != nil {
_, err = fmt.Scanf("%s", &in)
}
fmt.Println(in)
Run Code Online (Sandbox Code Playgroud) 我正在尝试 在数字海洋的一些教程之后在我的服务器上安装和配置drone.io.但是,当我尝试授权我的帐户(xxx.xxx.:8080/login)时,我得到一个空白网页,其中包含http 400状态代码,我重定向的最终网址如下所示:.xxx.xxx.xxx.xxx:8080/api/auth/github.com?code=28c9ea949a200523edasdaae&state=V5dsadaKLDQC4MASSMFUH2MLF5ZVSNCWNOIDEQ7JSVR4HLAW7EMGX4NJA%3D%3D%3D%3D
我该如何调试失败的原因?我已成功登录无人机,但我不知道日志的存储位置.我检查了/ var/log但找不到与无人机相关的任何内容.
挖掘代码我发现了一些我无法相信的东西.所有错误都被忽略了吗?