为了账号安全,请及时绑定邮箱和手机立即绑定

单例 http 客户端

单例 http 客户端

Go
慕后森 2022-06-13 17:29:58
我正在创建一个具有调用一些api的函数的类,到目前为止我有:var client *http.Clientfunc getClient() *http.Client {    if client == nil {        client = &http.Client{            Timeout: time.Second * 30,            Transport: &http.Transport{                Dial: (&net.Dialer{                Timeout:   30 * time.Second,                KeepAlive: 30 * time.Second,            }).Dial,            TLSHandshakeTimeout: 10 * time.Second,            },        }    }    return client}然后创建一个执行调用的函数:func CallRestApi(request Request) (response Response) {    getClient()    req, err := http.NewRequest(request.Method, url, bytes.NewBuffer(request.Params))        resp, err := client.Do(req)    ...}我不确定是否通过这种方式创建一个单例client实例,以便从执行此函数的任何模块中使用该实例(如果它已经存在)。
查看完整描述

2 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

这是一种更简单的方法:


var Client *http.Client= &http.Client{

            Timeout: time.Second * 30,

            Transport: &http.Transport{

                Dial: (&net.Dialer{

                Timeout:   30 * time.Second,

                KeepAlive: 30 * time.Second,

            }).Dial,

            TLSHandshakeTimeout: 10 * time.Second,

            },

        }

    }

您不需要单独的初始化函数来初始化变量。


查看完整回答
反对 回复 2022-06-13
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

如果您只从一个 goroutine调用,您的解决方案会创建一个http.Client实例。getClient()


如果你从多个 goroutine 调用它,那么它就是一个数据竞争,因此是未定义的行为。


您可以将您的client作为包初始化的一部分进行初始化,如果您从那时起只阅读它,您将是安全的:


var client = getClient()

如果您不能或不想这样做,请稍后再初始化您的clientusing sync.Once,您可以安全地同时使用:


var (

    once   sync.Once

    client *http.Client

)


func initClient() {

    once.Do(func() {

        client = &http.Client{

            Timeout: time.Second * 30,

            Transport: &http.Transport{

                Dial: (&net.Dialer{

                    Timeout:   30 * time.Second,

                    KeepAlive: 30 * time.Second,

                }).Dial,

                TLSHandshakeTimeout: 10 * time.Second,

            },

        }

    })

}


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 251 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号