golang的事物框架,golang 結構

本文目錄一覽:

golang有哪些不錯的遊戲伺服器框架

為什麼golang的開發效率高?

golang是一編譯型的強類型語言,它在開發上的高效率主要來自於後發優勢,不用考慮舊有噁心的歷史,又有一個較高的工程視角。良好的避免了程序員因為「 { 需不需要獨佔一行 」這種革命問題打架,也解決了一部分趁編譯時間找產品妹妹搭訕的階級敵人。

它有自己的包管理機制,工具鏈成熟,從開發、調試到發布都很簡單方便;

有反向介面、defer、coroutine等大量的syntactic sugar;

編譯速度快,因為是強類型語言又有gc,只要通過編譯,非業務毛病就很少了;

它在語法級別上支持了goroutine,這是大家說到最多的內容,這裡重點提一下。首先,coroutine並不稀罕,語言並不能超越硬體、操作系統實現神乎其神的功能。golang可以做到事情,其他語言也可以做到,譬如c++,在boost庫裡面自己就有的coroutine實現(當然用起來跟其他boost庫一樣噁心)。golang做的事情,是把這一套東西的使用過程簡化了,並且提供了一套channel的通信模式,使得程序員可以忽略諸如死鎖等問題。

goroutine的目的是描述並發編程模型。並發與並行不同,它並不需要多核的硬體支持,它不是一種物理運行狀態,而是一種程序邏輯流程。它的主要目的不是利用多核提高運行效率,而是提供一種更容易理解、不容易出錯的語言來描述問題。

實際上golang默認就是運行在單OS進程上面的,通過指定環境變數GOMAXPROCS才能轉身跑在多OS進程上面。有人提到了的pomelo,開源本來是一件很不錯的事情,但是基於自己對callback hell的偏見,我一直持有這種態度:敢用nodejs寫大規模遊戲伺服器的人,都是真正的勇士 : ) 。

2、Erlang與Golang的coroutine有啥區別,coroutine是啥?

coroutine本質上是語言開發者自己實現的、處於user space內的線程,無論是erlang、還是golang都是這樣。需要解決沒有時鐘中斷;碰著阻塞式i\o,整個進程都會被操作系統主動掛起;需要自己擁有調度控制能力(放在並行環境下面還是挺麻煩的一件事)等等問題。那為啥要廢老大的勁自己做一套線程放user space裡面呢?

並發是伺服器語言必須要解決的問題;

system space的進程還有線程調度都太慢了、佔用的空間也太大了。

把線程放到user space的可以避免了陷入system call進行上下文切換以及高速緩衝更新,線程本身以及切換等操作可以做得非常的輕量。這也就是golang這類語言反覆提及的超高並發能力,分分鐘給你開上幾千個線程不費力。

不同的是,golang的並發調度在i/o等易發阻塞的時候才會發生,一般是內封在庫函數內;erlang則更誇張,對每個coroutine維持一個計數器,常用語句都會導致這個計數器進行reduction,一旦到點,立即切換調度函數。

中斷介入程度的不同,導致erlang看上去擁有了preemptive scheduling的能力,而golang則是cooperative shceduling的。golang一旦寫出純計算死循環,進程內所有會話必死無疑;要有大計算量少i\o的函數還得自己主動叫runtime.Sched()來進行調度切換。

3、golang的運行效率怎麼樣?

我是相當反感所謂的ping\pong式benchmark,運行效率需要放到具體的工作環境下面考慮。

首先,它再快也是快不過c的,畢竟底下做了那麼多工作,又有調度,又有gc什麼的。那為什麼在那些benchmark裡面,golang、nodejs、erlang的響應效率看上去那麼優秀呢,響應快,並發強?並發能力強的原因上面已經提到了,響應快是因為大量非阻塞式i\o操作出現的原因。這一點c也可以做到,並且能力更強,但是得多寫不少優質代碼。

然後,針對遊戲伺服器這種高實時性的運行環境,GC所造成的跳幀問題確實比較麻煩,前面的大神 @達達 有比較詳細的論述和緩解方案,就不累述了 。隨著golang的持續開發,相信應該會有非常大的改進。一是屏蔽內存操作是現代語言的大勢所趨,它肯定是需要被實現的;二是GC演算法已經相當的成熟,效率勉勉強強過得去;三是可以通過incremental的操作來均攤cpu消耗。

用這一點點效率損失換取一個更高的生產能力是不是值得呢?我覺得是值得的,硬體已經很便宜了,人生苦短,讓自己的生活更輕鬆一點吧: )。

4、基於以上的論述,我認為採用go進行小範圍的MMORPG開發是可行的。

golang中級進階(二):結構體

目錄

一、結構體詳解

1. 結構體定義

2. 實例化結構體的7種方法

二、結構體方法

1. 結構體的方法定義

2. 結構體內自定義方法的引用

3. 任意類型添加方法

三、嵌套、繼承

1. 匿名結構體

2. 結構體中可以定義任意類型的欄位

3. 結構體嵌套結構體

4. 結構體嵌套匿名結構體

5. 結構體嵌套多個匿名結構體

6. 結構體繼承

四、結構體和JSON相互轉換

1. 結構體轉化成json

2. json轉化成結構體

3. 結構體標籤 tag

4. 嵌套結構體和json的序列化反序列化

Golang 中沒有「類」的概念,Golang 中的結構體和其他語言中的類有點相似。和其他面向對 象語言中的類相比,Golang 中的結構體具有更高的擴展性和靈活性。

Golang 中的基礎數據類型可以表示一些事物的基本屬性,但是當我們想表達一個事物的全 部或部分屬性時,這時候再用單一的基本數據類型就無法滿足需求了,Golang 提供了一種 自定義數據類型,可以封裝多個基本數據類型,這種數據類型叫結構體,英文名稱 struct。 也就是我們可以通過 struct 來定義自己的類型了。

使用 type 和 struct 關鍵字來定義結構體,具體代碼格式如下:

type 類型名 struct {

欄位名 欄位類型

欄位名 欄位類型 …

}

其中:

• 類型名:表示自定義結構體的名稱,在同一個包內不能重複。

• 欄位名:表示結構體欄位名。結構體中的欄位名必須唯一。

• 欄位類型:表示結構體欄位的具體類型。

在 go 語言中,沒有類的概念但是可以給類型(結構體,自定義類型)定義方法。所謂方法 就是定義了接收者的函數。接收者的概念就類似於其他語言中的 this 或者 self。

方法的定義格式如下:

func (接收者變數 接收者類型) 方法名(參數列表) (返回參數) {

函數體

}

注意:想改變結構體內的值,必須先變成指針。

在 Go 語言中,接收者的類型可以是任何類型,不僅僅是結構體,任何類型都可以擁有方法。 舉個例子,我們基於內置的 int 類型使用 type 關鍵字可以定義新的自定義類型,然後為我們 的自定義類型添加方法。

注意:匿名結構體中不允許出現多個重複的類型

注意:如果結構體裡面有私有屬性也就是小寫定義的欄位,則不會被json使用

golang有沒有好的開源遊戲框架

Go作為近兩年迅速流行起來的編程語言始終致力於使事情簡單化。它並未引入很多新概念,而是聚焦於打造一門簡單的語言,讓開發者使用起來感覺異常快速且簡單。相信有意向深入學習Go語言的小夥伴都在研究Go的開源項目,今天我就把自己覺得不錯的6個Go開源項目推薦給大家,希望大家能獲得收穫和成長。

推薦一:kubernetes 【Star:44418】

Kubernetes基於Docker,其目的是讓用戶通過Kubernetes集群來進行雲端容器集群的管理,而無需用戶進行複雜的設置工作。系統會自動選取合適的工作節點來執行具體的容器集群調度處理工作。

推薦二:etcd 【Star:21408】

etcd是由CoreOS開發並維護鍵值存儲系統,它使用Go語言編寫,並通過Raft一致性演算法處理日誌複製以保證強一致性。目前,Google的容器集群管理系統Kubernetes、開源PaaS平台Cloud Foundry和CoreOS的Fleet都廣泛使用了etcd。

推薦三:deis 【Star:6093】

Deis是一個基於Docker和CoreOS的開源PaaS平台,旨在讓部屬和管理伺服器上的應用變得輕鬆容易。它可以運行在AWS、GCE以及Openstack平台下。

推薦四:flynn 【Star:6936】

Flynn是一個使用Go語言編寫的開源PaaS平台,可自動構建部署任何應用到Docker容器集群上運行。Flynn項目受到Y Combinator的支持,目前仍在開發中,被稱為是下一代的開源PaaS平台。

推薦五:lime 【Star:13775】

相對上面的幾款Go語言在雲端和伺服器端之外,Lime則顯得比較特殊。Lime,則是一款用Go語言寫的桌面編輯器程序,被看做是著名編輯器Sublime Text的開源實現。

六:revel 【Star:10508】

Revel是一個高生產力的Go語言Web框架。Revel框架支持熱編譯,當編輯、保存和刷新源碼時,Revel會自動編譯代碼和模板;全棧特性,支持路由、參數解析、緩存、測試、國際化等功能。

golang性能測試框架k6源碼分析

k6是新興的性能測試框架,比肩jmeter,另外測試腳本使用js,更加適合自動化的架構。

k6啟動的框架是使用golang的cli標準框架cobra,入口函數

進入cobra框架後,我們直接查看getRunCmd,這個是命令run的入口,主要工作都是從這裡開始。

重點關注初始化Runner,這個是通過js腳本,使用goja庫解析後,生成的實際執行單元。

進入js目錄,查看Runner的結構,runner.go

Runner有一些配置屬性,另外還有方法,方法用lib.Runner的介面進行規範。

Runner有一個NewVU方法,裡面定義了連接參數,實現api測試

返回主函數,在初始化完成Runner後,啟動調度器,以及做結果收集

最終封裝成一個engine

啟動測試

GoLang — Gin框架

• 何為框架:

框架一直是敏捷開發中的利器,能讓開發者很快的上手並做出應用,甚至有的時候,脫離了框架,一些開發者都不會寫程序了。成長總不會一蹴而就,從寫出程序獲取成就感,再到精通框架,快速構造應用,當這些方面都得心應手的時候,可以嘗試改造一些框架,或是自己創造一個。

Gin是一個golang的微框架,封裝比較優雅,API友好,源碼注釋比較明確,已經發布了1.0版本。具有快速靈活,容錯方便等特點。其實對於golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯。框架更像是一些常用函數或者工具的集合。藉助框架開發,不僅可以省去很多常用的封裝帶來的時間,也有助於團隊的編碼風格和形成規範。

(1)首先需要安裝,安裝比較簡單,使用go get即可

go get github.com/gin-gonic/gin

如果安裝失敗,直接去Github clone下來,放置到對應的目錄即可。

(2)代碼中使用:

下面是一個使用Gin的簡單例子:

package main

import (

“github.com/gin-gonic/gin”

)

func main() {

router := gin.Default()

router.GET(“/ping”, func(c *gin.Context) {

c.JSON(200, gin.H{

“message”: “pong”,

})

})

router.Run(“:8080”) // listen and serve on 0.0.0.0:8080

}

簡單幾行代碼,就能實現一個web服務。使用gin的Default方法創建一個路由handler。然後通過HTTP方法綁定路由規則和路由函數。不同於net/http庫的路由函數,gin進行了封裝,把request和response都封裝到gin.Context的上下文環境。最後是啟動路由的Run方法監聽埠。麻雀雖小,五臟俱全。當然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法。

Gin可以很方便的支持各種HTTP請求方法以及返回各種類型的數據,詳情可以前往查看。

2.1 匹配參數

我們可以使用Gin框架快速的匹配參數,如下代碼所示:

冒號:加上一個參數名組成路由參數。可以使用c.Param的方法讀取其值。當然這個值是字串string。諸如/user/rsj217,和/user/hello都可以匹配,而/user/和/user/rsj217/不會被匹配。

瀏覽器輸入以下測試:

返回結果為:

其中c.String是gin.Context下提供的方法,用來返回字元串。

其中c.Json是gin.Context下提供的方法,用來返回Json。

下面我們使用以下gin提供的Group函數,方便的為不同的API進行分類。

我們創建了一個gin的默認路由,並為其分配了一個組 v1,監聽hello請求並將其路由到視圖函數HelloPage,最後綁定到 0.0.0.0:8000

C.JSON是Gin實現的返回json數據的內置方法,包含了2個參數,狀態碼和返回的內容。http.StatusOK代表返回狀態碼為200,正文為{“message”: 「welcome”}。

註:Gin還包含更多的返回方法如c.String, c.HTML, c.XML等,請自行了解。可以方便的返回HTML數據

我們在之前的組v1路由下新定義一個路由:

下面我們訪問

可以看到,通過c.Param(「key」)方法,Gin成功捕獲了url請求路徑中的參數。同理,gin也可以捕獲常規參數,如下代碼所示:

在瀏覽器輸入以下代碼:

通過c.Query(「key」)可以成功接收到url參數,c.DefaultQuery在參數不存在的情況下,會由其默認值代替。

我們還可以為Gin定義一些默認路由:

這時候,我們訪問一個不存在的頁面:

返回如下所示:

下面我們測試在Gin裡面使用Post

在測試端輸入:

附帶發送的數據,測試即可。記住需要使用POST方法.

繼續修改,將PostHandler的函數修改如下

測試工具輸入:

發送的內容輸入:

返回結果如下:

備註:此處需要指定Content-Type為application/x-www-form-urlencoded,否則識別不出來。

一定要選擇對應的PUT或者DELETE方法。

Gin框架快速的創建路由

能夠方便的創建分組

支持url正則表達式

支持參數查找(c.Param c.Query c.PostForm)

請求方法精準匹配

支持404處理

快速的返回給客戶端數據,常用的c.String c.JSON c.Data

golang反射框架Fx

Fx是一個golang版本的依賴注入框架,它使得golang通過可重用、可組合的模塊化來構建golang應用程序變得非常容易,可直接在項目中添加以下內容即可體驗Fx效果。

Fx是通過使用依賴注入的方式替換了全局通過手動方式來連接不同函數調用的複雜度,也不同於其他的依賴注入方式,Fx能夠像普通golang函數去使用,而不需要通過使用struct標籤或內嵌特定類型。這樣使得Fx能夠在很多go的包中很好的使用。

接下來會提供一些Fx的簡單demo,並說明其中的一些定義。

1、一般步驟

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

2、簡單demo

將io.reader與具體實現類關聯起來

輸出:

3、使用struct參數

前面的使用方式一旦需要進行注入的類型過多,可以通過struct參數方式來解決

輸出

如果通過Provide提供構造函數是生成相同類型會有什麼問題?換句話也就是相同類型擁有多個值呢?

下面兩種方式就是來解決這樣的問題。

4、使用struct參數+Name標籤

在Fx未使用Name或Group標籤時不允許存在多個相同類型的構造函數,一旦存在會觸發panic。

輸出

上面通過Name標籤即可完成在Fx容器注入相同類型

5、使用struct參數+Group標籤

使用group標籤同樣也能完成上面的功能

輸出

基本上Fx簡單應用在上面的例子也做了簡單講解

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

源碼中Name和Group兩個欄位與前面提到的Name標籤和Group標籤是一樣的,只能選其一使用

2、App(位於app.go文件) 提供注入對象具體的容器、LiftCycle、容器的啟動及停止、類型變數及實現類注入和兩者映射等操作

至於Provide和Populate的源碼相對比較簡單易懂在這裡不在描述

具體源碼

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

主要用於在application啟動初始化過程通過依賴注入的方式將容器中的變數值來填充給定的struct,其中target必須是指向struct的指針,並且只能填充可導出的欄位(golang只能通過反射修改可導出並且可定址的欄位),Extract將被Populate代替。 具體源碼

4、其他

諸如Populate是用來替換Extract的,而LiftCycle和inout.go涉及內容比較多後續會單獨提供專屬文件說明。

在Fx中提供的構造函數都是惰性調用,可以通過invocations在application啟動來完成一些必要的初始化工作:fx.Invoke(function); 通過也可以按需自定義實現LiftCycle的Hook對應的OnStart和OnStop用來完成手動啟動容器和關閉,來滿足一些自己實際的業務需求。

Fx框架源碼解析

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

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249814.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 17:11
下一篇 2024-12-12 17:11

相關推薦

  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Zlios——一個多功能的開發框架

    你是否在開發過程中常常遇到同樣的問題,需要不斷去尋找解決方案?你是否想要一個多功能、易於使用的開發框架來解決這些問題?那麼,Zlios就是你需要的框架。 一、簡介 Zlios是一個…

    編程 2025-04-29
  • agavi開發框架

    Agavi是一個基於MVC模式的Web應用程序開發框架,以REST和面向資源的設計為核心思想。本文章將從Agavi的概念、優點、使用方法和實例等方面進行詳細介紹。 一、概念 Aga…

    編程 2025-04-29
  • 使用Golang調用Python

    在現代軟體開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • Python unittest框架用法介紹

    Python unittest框架是Python自帶的一種測試框架,可以用來編寫並運行測試用例。在本文中,我們將從以下幾個方面詳細介紹Python unittest框架的使用方法和…

    編程 2025-04-29
  • com.alipay.sofa.bolt框架

    com.alipay.sofa.bolt框架是一款高性能、輕量級、可擴展的RPC框架。其廣泛被應用於阿里集團內部服務以及阿里雲上的服務。該框架通過NIO支持高並發,同時還內置了多種…

    編程 2025-04-29
  • Vue TS工程結構用法介紹

    在本篇文章中,我們將從多個方面對Vue TS工程結構進行詳細的闡述,涵蓋文件結構、路由配置、組件間通訊、狀態管理等內容,並給出對應的代碼示例。 一、文件結構 一個好的文件結構可以極…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導著程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Django框架:從簡介到項目實戰

    本文將從Django的介紹,以及如何搭建Django環境開始,逐步深入到Django模型、視圖、模板、表單,最後通過一個小型項目實戰,進行綜合性的應用,讓讀者獲得更深入的學習。 一…

    編程 2025-04-28

發表回復

登錄後才能評論