2017-07-06 17 views
0

我从Hashicorp库API获取数据,并奋力操纵它,因为我有接口朦胧的认识还:(使用mapstructure

我正在从PKI后台一个TLS证书响应与接口数据处理。使用转到自卸车,它输出这样的:

(0xc4203880c0) &Secret { 
    RequestID: "271c63ef-d7b6-a084-18a0-966dd6989f03", 
    LeaseID: "", 
    LeaseDuration: 0 (int), 
    Renewable: false, 
    Data: map[string]interface {} { 
    "serial_number": interface() , 
    "ca_chain": interface() , 
    "certificate": interface() , 
    "issuing_ca": interface() , 
    "private_key": interface() , 
    "private_key_type": interface() 
    }, 
    Warnings: nil ([]string), 
    Auth: nil (*api.SecretAuth), 
    WrapInfo: nil (*api.SecretWrapInfo) 
} 

我希望做的是打印使用fmt的“certficate”字段所以我这样做:

创建一个结构:

type TLSCredentialResp struct { 
    IssuingCA string `mapstructure:"issuing_ca"` 
    PrivateKey string `mapstructure:"private_key"` 
    CAChain string `mapstructure:"ca_chain"` 
    Cert  string `mapstructure:"certificate"` 
} 

,然后用mapstructure解码到它:

var response TLSCredentialResp 
if err := mapstructure.Decode(docker.Data, &response); err != nil { 
    log.Fatal("Error parsing vault's credential response: ", err) 
} 

fmt.Printf("Private Key: %s", response.PrivateKey) 

然而,当我尝试,我得到如下:

Error parsing vault's credential response: 1 error(s) decoding: 
* 'ca_chain' expected type 'string', got unconvertible type '[]interface {}' 
exit status 1 

现在是相当清楚,我,我已经得到这个错误,因为我试图将接口解码为字符串。什么是不明白的是我如何我处理interface()作为一种类型?简而言之,我怎样才能获得纯文本证书的价值呢?

+0

难道你惹去自卸车的输出?它将'interface()'显示为一个类型,但这不是件事。 'interface {}'是一种类型。此外,你的错误表明,ca链是一个'[]接口{}(一片空的接口)。首先要做的是找出底层类型是什么(['fmt.Printf(“%T”)'可以有所帮助](https://play.golang.org/p/Z3NNC0B0U0)),然后从那里。 – Adrian

+0

不,从来没有见过它,但它绝对是'interface()' – jaxxstorm

回答

0

所以我是个白痴,这比我想象的要容易得多。

我并不需要使用mapstructure看来,我可以这样做:

fmt.Printf("Private Key: %s", docker.Data["private_key"]) 
fmt.Printf("Cert: %s", docker.Data["certificate"]) 

虽然我不知道为什么..