这篇文章介绍一下go.uber.org/fx 包的使用,也是自己的学习笔记
下面代码是分析官方示例程序写的,包地址见godoc
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"time"
"go.uber.org/fx"
)
// 这里把main函数放到最前面,可以清晰的先了解代码调用方法,具体函数定义,自行跳跃过去查看
func main() {
// 整个fx包执行的顺序是
// 1. 先执行fx.Invoke中的函数列表,按顺序一个一个执行
// 2. fx.Provide中构造函数,在Invoke需要的时候,再去执行
// 执行Invoke中的函数时,当前执行的函数传入参数如果用到的变量,则先调用其构造函数
// 这里构造函数构造出来的变量不需要明显的进行定义,会自动传给invoke函数
// 比如nothingUserInvoke 这里没有任何传入参数,则在它之前不执行任何构造函数
//
// Register执行时,需要mux *http.ServeMux, h http.Handler, logger *log.Logger 三个传入参数,则执行对应的三个构造函数
// 但是在执行 NewHandler构造函数时,需要logger,则在其之前执行NewLogger
//
// invokeUseMyconstruct 执行时,需要先执行 NewMyConstruct
// 至于在fx.Lifecycle 中注册的Onstart OnStop 函数,是在app start 之后,按构造函数的顺序来执行,stop时,按相反顺序执行
app := fx.New(
// 一系列构造函数
fx.Provide(
NewMyConstruct,
NewHandler,
NewMux,
NewLogger,
),
// 构造函数执行完后,执行初始化函数
fx.Invoke(invokeNothingUse, invokeRegister, invokeAnotherFunc, invokeUseMyconstruct),
)
startCtx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel()
if err := app.Start(startCtx); err

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



