欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

依賴注入go語(yǔ)言,go需要依賴注入嗎

Go語(yǔ)言與Java之間性能相差多少

Java是一門(mén)較為成熟的語(yǔ)言,相對(duì)于C++要簡(jiǎn)單的多,C++里沒(méi)有內(nèi)存回收,所以比較麻煩,Java加入了內(nèi)存自動(dòng)回收,簡(jiǎn)單是簡(jiǎn)單,卻變慢了,go語(yǔ)言是一門(mén)新興的語(yǔ)言,現(xiàn)在版本是1.9 ? go語(yǔ)言的性能比Java要好,但由于出現(xiàn)晚,資料較Java少,有些Java的功能go也沒(méi)有,并且有許多的軟件是支持Java但支持go的很少.所以在短期內(nèi)Java是比go通用的

創(chuàng)新互聯(lián)公司是一家專業(yè)提供回民企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為回民眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

C語(yǔ)言的最大的優(yōu)勢(shì)是時(shí)間性能好,只比匯編慢20%~30%,C++最大的優(yōu)勢(shì)是快且面向?qū)ο?Java最大的優(yōu)勢(shì)是垃圾回收機(jī)制,GO語(yǔ)言的目標(biāo)是具備以上三者的優(yōu)勢(shì)

golang反射框架Fx

Fx是一個(gè)golang版本的依賴注入框架,它使得golang通過(guò)可重用、可組合的模塊化來(lái)構(gòu)建golang應(yīng)用程序變得非常容易,可直接在項(xiàng)目中添加以下內(nèi)容即可體驗(yàn)Fx效果。

Fx是通過(guò)使用依賴注入的方式替換了全局通過(guò)手動(dòng)方式來(lái)連接不同函數(shù)調(diào)用的復(fù)雜度,也不同于其他的依賴注入方式,F(xiàn)x能夠像普通golang函數(shù)去使用,而不需要通過(guò)使用struct標(biāo)簽或內(nèi)嵌特定類型。這樣使得Fx能夠在很多go的包中很好的使用。

接下來(lái)會(huì)提供一些Fx的簡(jiǎn)單demo,并說(shuō)明其中的一些定義。

1、一般步驟

大致的使用步驟就如下。下面會(huì)給出一些完整的demo

2、簡(jiǎn)單demo

將io.reader與具體實(shí)現(xiàn)類關(guān)聯(lián)起來(lái)

輸出:

3、使用struct參數(shù)

前面的使用方式一旦需要進(jìn)行注入的類型過(guò)多,可以通過(guò)struct參數(shù)方式來(lái)解決

輸出

如果通過(guò)Provide提供構(gòu)造函數(shù)是生成相同類型會(huì)有什么問(wèn)題?換句話也就是相同類型擁有多個(gè)值呢?

下面兩種方式就是來(lái)解決這樣的問(wèn)題。

4、使用struct參數(shù)+Name標(biāo)簽

在Fx未使用Name或Group標(biāo)簽時(shí)不允許存在多個(gè)相同類型的構(gòu)造函數(shù),一旦存在會(huì)觸發(fā)panic。

輸出

上面通過(guò)Name標(biāo)簽即可完成在Fx容器注入相同類型

5、使用struct參數(shù)+Group標(biāo)簽

使用group標(biāo)簽同樣也能完成上面的功能

輸出

基本上Fx簡(jiǎn)單應(yīng)用在上面的例子也做了簡(jiǎn)單講解

1、Annotated(位于annotated.go文件) 主要用于采用annotated的方式,提供Provide注入類型

源碼中Name和Group兩個(gè)字段與前面提到的Name標(biāo)簽和Group標(biāo)簽是一樣的,只能選其一使用

2、App(位于app.go文件) 提供注入對(duì)象具體的容器、LiftCycle、容器的啟動(dòng)及停止、類型變量及實(shí)現(xiàn)類注入和兩者映射等操作

至于Provide和Populate的源碼相對(duì)比較簡(jiǎn)單易懂在這里不在描述

具體源碼

3、Extract(位于extract.go文件)

主要用于在application啟動(dòng)初始化過(guò)程通過(guò)依賴注入的方式將容器中的變量值來(lái)填充給定的struct,其中target必須是指向struct的指針,并且只能填充可導(dǎo)出的字段(golang只能通過(guò)反射修改可導(dǎo)出并且可尋址的字段),Extract將被Populate代替。 具體源碼

4、其他

諸如Populate是用來(lái)替換Extract的,而LiftCycle和inout.go涉及內(nèi)容比較多后續(xù)會(huì)單獨(dú)提供專屬文件說(shuō)明。

在Fx中提供的構(gòu)造函數(shù)都是惰性調(diào)用,可以通過(guò)invocations在application啟動(dòng)來(lái)完成一些必要的初始化工作:fx.Invoke(function); 通過(guò)也可以按需自定義實(shí)現(xiàn)LiftCycle的Hook對(duì)應(yīng)的OnStart和OnStop用來(lái)完成手動(dòng)啟動(dòng)容器和關(guān)閉,來(lái)滿足一些自己實(shí)際的業(yè)務(wù)需求。

Fx框架源碼解析

主要包括app.go、lifecycle.go、annotated.go、populate.go、inout.go、shutdown.go、extract.go(可以忽略,了解populate.go)以及輔助的internal中的fxlog、fxreflect、lifecycle

go依賴注入dig包使用-來(lái)自u(píng)ber公司

原文鏈接:

github:

Dependency Injection is the idea that your components (usually structs in go) should receive their dependencies when being created. This runs counter to the associated anti-pattern of components building their own dependencies during initialization. Let’s look at an example.

Suppose you have a Server struct that requires a Config struct to implement its behavior. One way to do this would be for the Server to build its own Config during initialization.

This seems convenient. Our caller doesn’t have to be aware that our Server even needs access to Config . This is all hidden from the user of our function.

However, there are some disadvantages. First of all, if we want to change the way our Config is built, we’ll have to change all the places that call the building code. Suppose, for example, our buildMyConfigSomehow function now needs an argument. Every call site would need access to that argument and would need to pass it into the building function.

Also, it gets really tricky to mock the behavior of our Config . We’ll somehow have to reach inside of our New function to monkey with the creation of Config .

Here’s the DI way to do it:

Now the creation of our Server is decoupled from the creation of the Config . We can use whatever logic we want to create the Config and then pass the resulting data to our New function.

Furthermore, if Config is an interface, this gives us an easy route to mocking. We can pass anything we want into New as long as it implements our interface. This makes testing our Server with mock implementations of Config simple.

The main downside is that it’s a pain to have to manually create the Config before we can create the Server . We’ve created a dependency graph here – we must create our Config first because of Server depends on it. In real applications these dependency graphs can become very large and this leads to complicated logic for building all of the components your application needs to do its job.

This is where DI frameworks can help. A DI framework generally provides two pieces of functionality:

A DI framework generally builds a graph based on the “providers” you tell it about and determines how to build your objects. This is very hard to understand in the abstract, so let’s walk through a moderately-sized example.

We’re going to be reviewing the code for an HTTP server that delivers a JSON response when a client makes a GET request to /people . We’ll review the code piece by piece. For simplicity sake, it all lives in the same package ( main ). Please don’t do this in real Go applications. Full code for this example can be found here .

First, let’s look at our Person struct. It has no behavior save for some JSON tags.

A Person has an Id , Name and Age . That’s it.

Next let’s look at our Config . Similar to Person , it has no dependencies. Unlike Person , we will provide a constructor.

Enabled tells us if our application should return real data. DatabasePath tells us where our database lives (we’re using sqlite). Port tells us the port on which we’ll be running our server.

Here’s the function we’ll use to open our database connection. It relies on our Config and returns a *sql.DB .

Next we’ll look at our PersonRepository . This struct will be responsible for fetching people from our database and deserializing those database results into proper Person structs.

PersonRepository requires a database connection to be built. It exposes a single function called FindAll that uses our database connection to return a list of Person structs representing the data in our database.

To provide a layer between our HTTP server and the PersonRepository , we’ll create a PersonService .

Our PersonService relies on both the Config and the PersonRepository . It exposes a function called FindAll that conditionally calls the PersonRepository if the application is enabled.

Finally, we’ve got our Server . This is responsible for running an HTTP server and delegating the appropriate requests to our PersonService .

The Server is dependent on the PersonService and the Config .

Ok, we know all the components of our system. Now how the hell do we actually initialize them and start our system?

First, let’s write our main() function the old fashioned way.

First, we create our Config . Then, using the Config , we create our database connection. From there we can create our PersonRepository which allows us to create our PersonService . Finally, we can use this to create our Server and run it.

Phew, that was complicated. Worse, as our application becomes more complicated, our main will continue to grow in complexity. Every time we add a new dependency to any of our components, we’ll have to reflect that dependency with ordering and logic in the main function to build that component.

As you might have guessed, a Dependency Injection framework can help us solve this problem. Let’s examine how.

The term “container” is often used in DI frameworks to describe the thing into which you add “providers” and out of which you ask for fully-build objects. The dig library gives us the Provide function for adding providers and the Invoke function for retrieving fully-built objects out of the container.

First, we build a new container.

Now we can add new providers. To do so, we call the Provide function on the container. It takes a single argument: a function. This function can have any number of arguments (representing the dependencies of the component to be created) and one or two return values (representing the component that the function provides and optionally an error).

The above code says “I provide a Config type to the container. In order to build it, I don’t need anything else.” Now that we’ve shown the container how to build a Config type, we can use this to build other types.

This code says “I provide a *sql.DB type to the container. In order to build it, I need a Config . I may also optionally return an error.”

In both of these cases, we’re being more verbose than necessary. Because we already have NewConfig and ConnectDatabase functions defined, we can use them directly as providers for the container.

Now, we can ask the container to give us a fully-built component for any of the types we’ve provided. We do so using the Invoke function. The Invoke function takes a single argument – a function with any number of arguments. The arguments to the function are the types we’d like the container to build for us.

The container does some really smart stuff. Here’s what happens:

That’s a lot of work the container is doing for us. In fact, it’s doing even more. The container is smart enough to build one, and only one, instance of each type provided. That means we’ll never accidentally create a second database connection if we’re using it in multiple places (say multiple repositories).

Now that we know how the dig container works, let’s use it to build a better main.

The only thing we haven’t seen before here is the error return value from Invoke . If any provider used by Invoke returns an error, our call to Invoke will halt and that error will be returned.

Even though this example is small, it should be easy to see some of the benefits of this approach over our “standard” main. These benefits become even more obvious as our application grows larger.

One of the most important benefits is the decoupling of the creation of our components from the creation of their dependencies. Say, for example, that our PersonRepository now needs access to the Config . All we have to do is change our NewPersonRepository constructor to include the Config as an argument. Nothing else in our code changes.

Other large benefits are lack of global state, lack of calls to init (dependencies are created lazily when needed and only created once, obviating the need for error-prone init setup) and ease of testing for individual components. Imagine creating your container in your tests and asking for a fully-build object to test. Or, create an object with mock implementations of all dependencies. All of these are much easier with the DI approach.

I believe Dependency Injection helps build more robust and testable applications. This is especially true as these applications grow in size. Go is well suited to building large applications and has a great DI tool in dig . I believe the Go community should embrace DI and use it in far more applications.

go有哪些快速開(kāi)發(fā)的web框架

推薦五款開(kāi)快速開(kāi)發(fā)的Web框架

1. 項(xiàng)目名稱:基于 Go 的 Web 框架 Faygo

項(xiàng)目簡(jiǎn)介:Faygo 是一款快速、簡(jiǎn)潔的 Go Web 框架,可用極少的代碼開(kāi)發(fā)出高性能的 Web 應(yīng)用程序(尤其是API接口)。只需定義 struct Handler,F(xiàn)aygo 就能自動(dòng)綁定、驗(yàn)證請(qǐng)求參數(shù)并生成在線API文檔。

2. 項(xiàng)目名稱:基于 Go 的 Web 開(kāi)發(fā)框架 essgo

項(xiàng)目簡(jiǎn)介:essgo 是一款 Go 語(yǔ)言開(kāi)發(fā)的簡(jiǎn)單、穩(wěn)定、高效、靈活的 web 開(kāi)發(fā)框架。它的項(xiàng)目組織形式經(jīng)過(guò)精心設(shè)計(jì),實(shí)現(xiàn)前后端分離、系統(tǒng)與業(yè)務(wù)分離,完美兼容 MVC 與 MVVC 等多種開(kāi)發(fā)模式,非常利于企業(yè)級(jí)應(yīng)用與 API 接口的開(kāi)發(fā)。當(dāng)然,最值得關(guān)注的是它突破性支持運(yùn)行時(shí)路由重建,開(kāi)發(fā)者可在 Admin 后臺(tái)輕松配置路由,并實(shí)現(xiàn)啟用/禁用模塊或操作、添加/移除中間件等!同時(shí),它以 ApiHandler 與 ApiMiddleware 為項(xiàng)目基本組成單元,可實(shí)現(xiàn)編譯期或運(yùn)行時(shí)的自由搭配組合,也令開(kāi)發(fā)變得更加靈活富有趣味性。

3. 項(xiàng)目名稱:模塊化設(shè)計(jì)的 Go Web 框架 Macaron

項(xiàng)目簡(jiǎn)介:Macaron 是一個(gè)具有高生產(chǎn)力和模塊化設(shè)計(jì)的 Go Web 框架。框架秉承了 Martini 的基本思想,并在此基礎(chǔ)上做出高級(jí)擴(kuò)展。

4. 項(xiàng)目名稱:基于Go 的輕量級(jí) Web 框架 GoInk

項(xiàng)目簡(jiǎn)介:HxGo 是基于我以往的 php 開(kāi)發(fā)經(jīng)驗(yàn)編寫(xiě)的 Go Web 框架。力求簡(jiǎn)單直接,符合大眾編寫(xiě)習(xí)慣,同時(shí)性能優(yōu)良。 HxGo 基于 MVC 的結(jié)構(gòu)模式,實(shí)現(xiàn) REST 支持的自動(dòng)路由分發(fā),簡(jiǎn)化 HTTP 請(qǐng)求和視圖操作。同時(shí),HxGo 提供簡(jiǎn)易直接的數(shù)據(jù)訪問(wèn)層,高效直接操作數(shù)據(jù)庫(kù)內(nèi)容。

5. 項(xiàng)目名稱:簡(jiǎn)單高效的 Go web 開(kāi)發(fā)框架 Baa

項(xiàng)目簡(jiǎn)介:Baa 是一個(gè)簡(jiǎn)單高效的 Go web 開(kāi)發(fā)框架。主要有路由、中間件,依賴注入和HTTP上下文構(gòu)成。Baa 不使用 反射和正則,沒(méi)有魔法的實(shí)現(xiàn)。

特性:

支持靜態(tài)路由、參數(shù)路由、組路由(前綴路由/命名空間)和路由命名;

路由支持鏈?zhǔn)讲僮鳎?/p>

路由支持文件/目錄服務(wù);

中間件支持鏈?zhǔn)讲僮鳎?/p>

支持依賴注入*;

支持 JSON/JSONP/XML/HTML 格式輸出;

統(tǒng)一的 HTTP 錯(cuò)誤處理;

統(tǒng)一的日志處理;

支持任意更換模板引擎(實(shí)現(xiàn) baa.Renderer 接口即可)。

本文標(biāo)題:依賴注入go語(yǔ)言,go需要依賴注入嗎
文章來(lái)源:http://chinadenli.net/article4/hshpoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器靜態(tài)網(wǎng)站ChatGPT小程序開(kāi)發(fā)外貿(mào)網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管