请考虑这个问题。
ourClient是一个*http.Client --一旦生成它,如何仅改变TLSClientConfig (它的类型是tls.Config{})?
package main
import (
"crypto/tls"
"fmt"
"net"
"net/http"
"time"
)
func main() {
transport := &http.Transport{
TLSHandshakeTimeout: 10 * time.Second,
Dial: (&net.Dialer{
Timeout: 1 * time.Second,
KeepAlive: 30 * time.Second,
}).Dial,
TLSClientConfig: &tls.Config{},
}
ourClient := &http.Client{
Timeout: 5 * time.Second,
Transport: transport,
}
fmt.Printf("http.Client Timeout %v\n", ourClient.Timeout)
ourClient.Timeout = 3 * time.Second
fmt.Printf("http.Client Timeout %v\n", ourClient.Timeout)
// how do I replace the TLSClientConfig in ourClient
// newTLSClientConfig := &tls.Config{}
// ourClient.Transport.TLSClientConfig = newTLSClientConfig
// ourClient.Transport.TLSClientConfig undefined (type http.RoundTripper has no field or method TLSClientConfig)
fmt.Printf("http: %#v\n", ourClient)
}发布于 2022-11-06 01:06:21
http.RoundTripper是一个接口--您需要使用类型断言将它转换为具体的实现,例如:
...
newTLSClientConfig := &tls.Config{}
if tpt, ok := ourClient.Transport.(*http.Transport); ok {
tpt.TLSClientConfig = newTLSClientConfig
}
...https://go.dev/play/p/2UinL3Uazid
它可能更好地解释了这里,但是FWIW - http.Client.Transport被声明为一个RoundTripper接口,一个接口可以有许多不同的实现,而其中没有一个由接口契约保证有一个TLSClientConfig字段。所以Go编译器不允许您分配newTLSClientConfig字段,因为它在法律上不能。
类型断言断言接口的具体实现符合类型,并将接口的实现(在本例中为http.Transport)分配给变量(本例中为tpt)。因此,现在可以保证tpt是http.Transport的一个实例,这意味着您现在可以将newTLSClientConfig分配给TLSClientConfig字段。
如果ok是错误的,那就意味着RoundTripper接口的实现不是http.Transport。
https://stackoverflow.com/questions/74332573
复制相似问题