微服务:GO语言之村夫踩坑记

88 阅读1分钟

注: 本帖会不定时根据踩到坑进行中新

  1. XML Marshal,无法为key打上namespace别名的问题 我希望处理出来的xml如下:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:rfc:functions">
    <soapenv:Header></soapenv:Header>
    <soapenv:Body>
        <urn:ZSDSO_LIST_STATUS>
            <E_OUTPUT></E_OUTPUT>
            <I_KUNNR>12345678</I_KUNNR>
            <I_STATUS>01</I_STATUS>
        </urn:ZSDSO_LIST_STATUS>
    </soapenv:Body>
</soapenv:Envelope>

使用encoding/xml,当带上别名生成xml时, 只能生成一个xmlns="http://xxxxxaaaaa" 这样的namespace,不支持别名。
替代处理方案是,先生成不带namespace的xml,但是为Envelope生成soapenv和urn两个属性值。然后将该xml数据流使用正则行处理替换成带别名的格式
2. 结构体的json处理时,字段首字母的坑

package main

import (
   "encoding/json"
   "fmt"
)

type testjson struct {
   door string
   wind string
}

func main() {
   jsonData := []byte(`{
         "door":"bigdoor",
         "wind":"smalwind"
      }`)

   var newjson testjson
   err := json.Unmarshal(jsonData, &newjson)
   if err != nil {
      panic(err)
   }
   fmt.Println(newjson.wind)
   fmt.Println(newjson.door)
}

上面的代码,很遗憾,只能得到两个空行。因为字段为小写字母开头,无法解析,即使是在同一个包中使用结构体!

只好定义成如下所示:

type testjson struct {
   Door string `json:"door"`
   Wind string `json:"wind"`
}

这个很无语,但也只好捏着鼻子认了