小编kos*_*tix的帖子

序列化为JSON时,如何根据运行时条件省略某些字段?

在Go中实现的Web服务中,我希望能够根据用户的角色限制JSON响应中返回的字段.

例如,我可能有一个具有角色的当前登录用户和具有该角色的guest另一个用户admin

对于管理员,我希望json拥有所有密钥,例如

{
  id: 1,
  name: "John",
  role: "admin"
}
Run Code Online (Sandbox Code Playgroud)

并且对于客人没有角色密钥,例如

{
  id: 1,
  name: "John"
}
Run Code Online (Sandbox Code Playgroud)

我现在可以编组json并返回所有字段.我需要能够限制它.

json go

3
推荐指数
1
解决办法
3247
查看次数

如何使用gokogiri(libxml2)使用命名空间解析xml?

github.com/moovweb/gokogiri用来解析XML文档.以下在解析var b时工作,但是当我尝试相同的on var a(具有命名空间)时,我没有输出.如何解析具有命名空间的XML gokogiri

package main

import (
    "github.com/moovweb/gokogiri"
    "github.com/moovweb/gokogiri/xpath"
    "log"
)

func main() {
    log.SetFlags(log.Lshortfile)
    doc, _ := gokogiri.ParseXml([]byte(a))
    defer doc.Free()
    doc.SetNamespace("", "http://example.com/this")
    x := xpath.Compile(".//NodeA/NodeB")
    groups, err := doc.Search(x)
    if err != nil {
        log.Println(err)
    }
    for i, group := range groups {
        log.Println(i, group)
    }
}

var a = `<?xml version="1.0" ?><NodeA xmlns="http://example.com/this"><NodeB>thisthat</NodeB></NodeA>`
var b = `<?xml version="1.0" ?><NodeA><NodeB>thisthat</NodeB></NodeA>`
Run Code Online (Sandbox Code Playgroud)

编辑#1:我也试过doc.RegisterNamespace但得到了

doc.RegisterNamespace undefined(type*xml.XmlDocument没有字段或方法RegisterNamespace)"

x.RegisterNamespace得到

x.RegisterNamespace undefined(type*xpath.Expression没有字段或方法RegisterNamespace)"

xml go libxml2

3
推荐指数
1
解决办法
725
查看次数

如何将嵌套的XML元素解组成数组?

我的XML包含一组预定义元素,但我无法获取数组.这是XML结构:

var xml_data = `<Parent>
                   <Val>Hello</Val>
                   <Children>
                      <Child><Val>Hello</Val></Child>
                      <Child><Val>Hello</Val></Child>
                      <Child><Val>Hello</Val></Child>
                   </Children>
                </Parent>`
Run Code Online (Sandbox Code Playgroud)

这是完整的代码,这里是游乐场链接.运行它将获取Parent.Val,但不是Parent.Children.

package main

import (
    "fmt"
    "encoding/xml"
)

func main() {

    container := Parent{}
    err := xml.Unmarshal([]byte(xml_data), &container)

    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(container)  
    }
}

var xml_data = `<Parent>
                   <Val>Hello</Val>
                   <Children>
                      <Child><Val>Hello</Val></Child>
                      <Child><Val>Hello</Val></Child>
                      <Child><Val>Hello</Val></Child>
                   </Children>
                </Parent>`

type Parent struct {
    Val string
    Children []Child
}

type Child struct {
    Val string
}
Run Code Online (Sandbox Code Playgroud)

编辑:我在这里简化了一下这个问题.基本上我不能解组任何数组,而不仅仅是预定义的结构.以下是更新的工作代码.在该示例中,只有一个项目在容器界面中结束.

func main() {

    container := []Child{} …
Run Code Online (Sandbox Code Playgroud)

xml go unmarshalling

3
推荐指数
2
解决办法
4616
查看次数

如何在EXE文件的PE头中设置"文件版本"字段?

go build用来构建一个文件.exe然后我查看文件的属性(右键单击文件 - >属性),在detail选项卡中,文件的版本为空.

我如何设置exe文件的版本.

在此输入图像描述

go portable-executable

3
推荐指数
1
解决办法
640
查看次数

如何在 HTTP 中间件处理程序之间重用 *http.Request 的请求正文?

我使用 go-chi 作为 HTTP 路由器,我想在另一种方法中重用一种方法

func Registration(w http.ResponseWriter, r *http.Request) {
    b, err := ioutil.ReadAll(r.Body) // if you delete this line, the user will be created   
    // ...other code

    // if all good then create new user
    user.Create(w, r)
}

...

func Create(w http.ResponseWriter, r *http.Request) {
  b, err := ioutil.ReadAll(r.Body)  
  // ...other code

  // ... there I get the problem with parse JSON from &b
}
Run Code Online (Sandbox Code Playgroud)

user.Create 返回错误 "unexpected end of JSON input"

其实,在我执行的ioutil.ReadAll
user.Create停止解析JSON,
r.Body …

middleware http go

3
推荐指数
2
解决办法
1824
查看次数

将文件添加到 docker 映像会导致“权限被拒绝”错误

我正在创建一个 docker golang 映像,但我的 golang 应用程序需要在启动时读取 config.yaml。我尝试添加文件,如下面的 dockerfile 所示:

FROM golang:alpine as builder
# Install git + SSL ca certificates
RUN apk update && apk add git && apk add ca-certificates
# Create appuser
COPY . $GOPATH/src/github.com/user/app/
WORKDIR $GOPATH/src/github.com/user/app/
#get dependancies
RUN go get -d -v
#build the binary
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /go/bin/app
# STEP 2 build a small image
# start from scratch
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ADD ./config.yaml /go/bin/app/
# Copy our …
Run Code Online (Sandbox Code Playgroud)

docker

3
推荐指数
1
解决办法
2万
查看次数

如何在循环外使用模板变量?

在go模板中,我想获取循环中的最后一条消息,以在循环外使用:

    {{range $m := .messages}}      
            <div>Message subject: {{$m.Subject}}</div>

            {{$lastMsg := $m}}
    {{end}}


    <div>The last message's subject: {{$lasMsg.Subject}}</div> 
Run Code Online (Sandbox Code Playgroud)

但这不起作用,并且出现此错误:

 undefined variable "$lastMsg"
Run Code Online (Sandbox Code Playgroud)

我也尝试过,{{.lastMsg := $m}}但随后得到:

 unexpected ":=" in operand
Run Code Online (Sandbox Code Playgroud)

那么我该如何解决呢?

go go-templates

3
推荐指数
1
解决办法
77
查看次数

获取文件的uid和gid

在 linux 中,stat结构体包含文件的 UID 和 GID。

有没有办法使用 Go(lang) 获取文件的相同信息(UID 和 GID)?

linux go stat

3
推荐指数
1
解决办法
3844
查看次数

如何将字符串转换为 google.protobuf.Timestamp?

我有一个 Go 字符串x := "2020-09-01T21:46:43Z"

这是我的 Protobuf3:

message MyMessage {
  google.protobuf.Timestamp mytimestamp = 1;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能把这个字符串转换x成a google.protobuf.Timestamp

go protocol-buffers

3
推荐指数
1
解决办法
8587
查看次数

GET请求返回403状态码(解析)

我正在尝试获取状态为 200 的https://www.avito.ru/moskva页面的正确正文。

req, err := http.NewRequest("GET", "https://www.avito.ru/moskva", nil)
req.Header.Add("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0")
req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")

client := &http.Client{}
res, err := client.Do(req)
if err != nil {
    panic(err)
}
defer res.Body.Close()

fmt.Println(res.Status)
printBody(res) // prints body of page
Run Code Online (Sandbox Code Playgroud)

输出:

403 Forbidden
"security stub from site (says that my ip banned)"
Run Code Online (Sandbox Code Playgroud)

我可以在浏览器中打开此页面,而不会出现任何警告。

我用 python 成功获取了 body:

import requests

session = requests.Session()
session.headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0',
    'Accept-Language': …
Run Code Online (Sandbox Code Playgroud)

go web-scraping

3
推荐指数
1
解决办法
1525
查看次数