# I am the Watcher. I am your guide through this vast new twtiverse.
# 
# Usage:
#     https://watcher.sour.is/api/plain/users              View list of users and latest twt date.
#     https://watcher.sour.is/api/plain/twt                View all twts.
#     https://watcher.sour.is/api/plain/mentions?uri=:uri  View all mentions for uri.
#     https://watcher.sour.is/api/plain/conv/:hash         View all twts for a conversation subject.
# 
# Options:
#     uri     Filter to show a specific users twts.
#     offset  Start index for quey.
#     limit   Count of items to return (going back in time).
# 
# twt range = 1 2879
# self = https://watcher.sour.is?uri=https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt&offset=2079
# next = https://watcher.sour.is?uri=https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt&offset=2179
# prev = https://watcher.sour.is?uri=https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt&offset=1979
Go 語言導出包解密:外部訪問你的類型和值**
一、概述Go 語言實現封裝和可見性控制的主要方式是通過標識符的首字母大小寫來決定其是否可被其他包訪問。標識符如果首字母大寫就可以被外部包訪問 (導出), 可以選擇性地控制包內代碼的對外可見性。本文介紹如何導出包中的標識符, 讓外部包可以訪問包內定義的類型、變量、常量、函數、導出類型注意事項。主要內容包括 導出標識符的規則 導出類型的注意事項 導出結構體字段的方法 導出函數的注意 ⌘ Read more
以可視化方式解釋 Go 併發 - 通道**
在併發編程中,許多編程語言採用共享內存 / 狀態模型。然而,Go 通過實現 通信順序進程 (CSP) 區別於衆多語言。在 CSP 中,一個程序由並行的進程組成,這些進程不共享狀態,而是使用通道進行通信和同步它們的操作。因此,對於有意採用 Go 的開發人員來說,理解通道的工作原理變得至關重要。在本文中,我將使用 Gopher 運行他們的虛構咖啡館的可愛比喻來闡述通道,因爲我堅信人類更容易通過視覺學習 ⌘ Read more
Go 單機能創建多少個 Goroutine
Go 語言以其顯著的併發性能和輕量級的線程模型而聞名。Goroutine,作爲 Go 語言中實現併發的主要手段,允許開發人員編寫高效且併發的代碼。那麼,在 Go 單機上究竟能創建多少個 Goroutine 呢?下面我們來一起分析分析。 前置    首先我們來計算一個 Goroutine 的大小。Go 語言中 Goroutine 的堆棧初始大小,在早期的版本中是 4KB。然而,在後續的更新中 ⌘ Read more
使用 go 語言開發 hive 導出工具**
1 前言----新版 hive 提供了 beeline 工具,可以執行 SQL 並導出數據,不過操作還是有點複雜的,團隊裏有些同學不會 Linux 的基本操作,所以我花了億點點時間寫了個交互式的命令行工具方便使用。2 效果----命令行工具,就是這麼樸實無華。3 探索過程------一開始是打算用 bash 腳本,結果發現根本不會寫,beeline 導出數據只能使用輸出重定向,shell 腳本里面 ⌘ Read more
Golang 1-22 中更好的 HTTP 服務器路由**
對於 Web 開發的人來說,使用 golang 語言無疑是個明智的選擇。但是 golang 本身標準庫提供的功能相對有限,尤其是需要撰寫複雜的路由和路勁匹配(這在微服務中很常見)時的多路複用功能,必須要配合使用第三方的多路複用器(比如 gorilla/mux)。但是最新一個好消息是,golang 1.22 中的標準 net/http 將默認提供增強模式匹配能力包多路複用器。本文我們就一起來學習一下 ⌘ Read more
寫給 go 開發者的 gRPC 教程 - gRPC Gateway
gRPC 使用 protobuf 來序列化數據,使用 protobuf 序列化的好處這裏就不再贅述了但 protobuf 不是明文,不方便我們進行調試,如果能像 HTTP1.x 一樣進行訪問,就能減輕調試的負擔;在特殊場景下 client 側無法使用 HTTP2.0,因而也無法使用 gRPC 來進行調用,需要提供降級方案gRPC-Gateway 是 protobuf 編譯器 protoc 的插件 ⌘ Read more
Go TLS 服務端綁定證書的幾種方式**
隨着互聯網的發展,網站提供的服務類型和規模不斷擴大,同時也對 Web 服務的安全性提出了更高的要求。TLS(Transport Layer Security)[1] 已然成爲 Web 服務最重要的安全基礎設施之一。默認情況下,一個 TLS 服務器通常只綁定一個證書 [2],但當服務複雜度增加時,單一證書已然難以滿足需求。這時,服務端綁定多個 TLS 證書就成爲一個非常實用的功能。Go 語言中的 n ⌘ Read more
Go 中的流量限制: 有效控制流量**
介紹速率限制是構建可擴展和彈性系統的關鍵技術。它通過對指定時間範圍內允許的請求數量施加限制來幫助控制流量。在 Go 中實現速率限制可以確保最佳的資源利用,並保護您的應用程序免受過度流量或濫用行爲的影響。在這篇博文中,我們將探索 Go 中的速率限制技術,並提供實用的代碼示例來幫助您有效地實現它們。理解速率限制速率限制包括定義一組規則,這些規則決定客戶端在給定的時間窗口內可以發出多少請求。確保系統能夠 ⌘ Read more
GO 語言處理併發的時候我們是選擇 sync 還是 channel
以前寫 C 的時候,我們一般是都通過共享內存來通信,對於併發去操作某一塊數據時,爲了保證數據安全,控制線程間同步,我們們會去使用互斥鎖,加鎖解鎖來進行處理然而 GO 語言中建議的時候通過通信來共享內存,使用 channel 來完成臨界區的同步機制可是 GO 語言中的 channel 畢竟是屬於比較高級的原語,自然在性能上就比不上 sync 包裏面的鎖機制,感興趣的同學可以自己寫一個簡單的基準測試來 ⌘ Read more
golang select 機制**
來源: 愛發白日夢的後端在 Go 語言中,select 是一種用於處理多個通道操作的控制結構。它可以用於在多個通道之間進行非阻塞的選擇操作。select 語句由一系列的 case 子句組成,每個 case 子句表示一個通道操作。select 語句會按照順序依次檢查每個 case 子句,並執行其中可執行的操作。select 的作用主要有以下幾個方面:多路複用通道select 可以同時監聽多個通道上的 ⌘ Read more
[Go 工具庫] 輕量級彈性搜索引擎 Zinc
一、前言Zinc 是一個輕量級替代 Elasticsearch 的開源搜索引擎。Elasticsearch 真的好用,但是 Elasticsearch 安裝和配置也是真的繁瑣,後續的一些維護也有一定成本。另外一個 Elasticsearch 的不足就是服務運行起來需要的計算資源較多,對於普通的用戶來說是有點浪費的。Zinc,擁有完全兼容 Elasticsearch 的 APIs,同時自帶 UI 用 ⌘ Read more
基於公鑰驗籤實現應用許可機制**
隨着互聯網的普及以及應用的快速發展,商業軟件的訂閱模式變得越來越流行。軟件公司開始提供基於訂閱的服務,用戶每月或每年支付費用以獲取軟件的使用權。這種模式使用戶可以更靈活地選擇服務期限,並且軟件公司可以持續提供更新和技術支持。隨着 “軟件定義汽車” 的到來,這種模式在智能網聯汽車領域也逐漸流行開來!一些需要私有化部署在客戶現場的 toB 商業軟件的公司也在探索這種訂閱許可證模式,但與 toC 的軟件 ⌘ Read more
用 Golang 手寫一個 Container
本文作者系 360 奇舞團前端開發工程師前言Docker 作爲一種流行的容器化技術,對於每一個程序開發者而言都具有重要性和必要性。因爲容器化相關技術的普及大大簡化了開發環境配置、更好的隔離性和更高的安全性,對於部署項目和團隊協作而言也更加方便。本文將嘗試使用 Go 語言編寫一個極簡版的容器,以此來了解容器的基本原理。前置知識儲備:Linux 基礎知識 Docker 是基於 Linux 容 ⌘ Read more
Go PGO 快速上手,性能可提高 2~4-!**
大家好,我是煎魚。2023 年初,在 Go1.20,PGO 發佈了預覽版本。在本次 Go1.21 的新版本發佈,修復了各種問題後,PGO 已經正式官宣生產可用。今天這篇文章就是和大家一起跟着官方示例,快速體驗他的性能優化和使用。溫習一下 PGO--------Profile-guided optimization (PGO),PGO 是計算機編程中的一種編譯器優化技術,藉助配置文件來引導編譯,達到 ⌘ Read more~
Go 語言是 如何實現反向代理與各種負載均衡策略**
負載均衡策略可以通過配置 Nginx 來實現。以下是一些常見的負載均衡策略,我們先來看看在 Nginx 中是如何配置的:1. 加權輪詢(Weighted Round Robin):加權輪詢允許爲不同的後端服務器分配不同的權重,以便某些服務器處理更多的請求。在 Nginx 中,可以使用weight參數來配置服務器的權重。http {    upstream backend {        serv ⌘ Read more
Go 語言基礎之結構體(冬日篇)**
前言--Hey,大家好呀,我是碼農,星期八,這是最後一次了,同樣也是 Go 面向對象的最後一次了。堅持住,一起看看看吧。結構體繼承-----說起繼承,學過 Java,Python 的肯定都不陌生,但是 Go 中,可沒有這個東西吶。那咋辦呢???,還是得用結構體來實現。假裝我們都是男孩,喜歡車,那我們就拿車來舉例子吧。車結構體//車type Car struct { Brand string ⌘ Read more
Go 語言基礎之結構體(秋日篇)**
前言--Hey,大家好呀,碼農我是星期八,咱們接着上次繼續說, 看一下結構體還有什麼其他操作。沒來得及上車的小夥伴請戳:Go 語言基礎之結構體(春日篇)、Go 語言基礎之結構體(夏日篇)。匿名字段結構體-------如果以後再遇到匿名這個詞,就把他當作沒有名字的意思。匿名加字段結構體代碼。package mainimport "fmt"type Student struct { string ⌘ Read more
Golang sql 標準庫源碼解析**
0 前言近期和大家一起探討 go 語言中關係型數據庫有關的話題.本系列會拆分爲多個篇章:• database/sql 庫研究: 研究 go 語言 sql 標準庫下對數據庫連接池的實現細節,以及對數據庫驅動模塊的接口定義規範 • mysql driver 庫研究: 研究 go 語言下 mysql 數據庫驅動的底層實現細節,對應開源地址:https://github.com/go-sql-driRead more
Go 語言錯誤碼設計與管理實踐**
引言1.1 背景------最近在做一個和前端、第三方平臺(可以簡單理解爲公司別的部門或者客戶軟件)直接交互的服務,涉及到用戶註冊、登錄、數據處理等模塊。架構圖大概如下:拿到需求後,結合團隊內部熟悉的技術棧,我們確定了後臺服務【業務邏輯層】使用 Golang 語言來開發,用到的框架有 Gin 來做 HTTP 交互,Swaggo 自動生成接口文檔,Redis 和 MySQL 作爲 K-V 和 DB ⌘ Read more
Go 語言實現延遲隊列**
簡單 Go 語言延遲隊列思路: package mainimport ( "fmt" "time")// Message is a structure that holds the contents of the message.type Message struct { ID int Body string Delay time.Duration}// delayMes ⌘ Read more
Go 併發可視化解釋 - Semaphore
在這個系列的最後兩篇文章中,我們討論了來自sync包的Mutex和RWMutex。當我們希望只有一個 Goroutine 能夠獨佔地訪問共享數據時,這兩個結構非常有用。然而,在現實生活中,有些用例需要允許多個用戶同時訪問共享資源。這個數量可以很大,也可以很小,但必須始終是有限的。例如,一個容納 60000 人的體育場在任何時候都不應容納超過這個數量的人。或者,在機場,無論乘客隊列有多長,同時允許辦 ⌘ Read more
Go 接口 - 構建可擴展 Go 應用**
本文深入探討了 Go 語言中接口的概念和實際應用場景。從基礎知識如接口的定義和實現,到更復雜的實戰應用如解耦與抽象、多態、錯誤處理、插件架構以及資源管理,文章通過豐富的代碼示例和詳細的解釋,展示了 Go 接口在軟件開發中的強大功能和靈活性。一、引言爲什麼要學習 Go 接口------------接口是 Go 編程語言中一個至關重要的概念,它不僅僅是一種類型抽象,更是一種編程範式和設計思想的體現 ⌘ Read more
超實用!基於 Go 內嵌設計更優雅的代碼**
一、概述Go 語言支持類型內嵌和結構體內嵌, 可以在類型系統中建立類型的繼承關係。本文將詳細介紹 Go 語言內嵌的語法、實現原理和實際應用, 以及類型內嵌和結構體內嵌的區別。主要內容包括: 類型內嵌語法 結構體內嵌語法 內嵌類型與組合類型 接口內嵌與實現 內嵌類型的方法集 內嵌共享字段名 內嵌構成類型系統 內嵌與繼承的差異 實際應用案例 希望通過 ⌘ Read more
Go 泛型解密:從基礎到實戰的全方位解析**
本篇文章深入探討了 Go 語言的泛型特性,從其基礎概念到高級用法,並通過實戰示例展示了其在實際項目中的應用。一、概述泛型編程是計算機科學中一個相當重要的概念,廣泛應用於各種編程語言和框架中。在 Go 語言中,泛型的討論和實現也走了一段相對漫長的路。這一路上既有激烈的討論,也有種種的嘗試和迭代。本節將對泛型的基礎概念進行深入分析,並探究其在 Go 中的歷史與現狀。什麼是泛型-----泛型,又稱爲 ⌘ Read more
Go 項目目錄該怎麼組織?官方終於出指南了!**
長久以來,在 Go 語言進階的學習和實踐之路上,Go 項目目錄究竟如何佈局一直是困擾大家的一個問題,這是因爲 Go 官方針對這個問題遲遲沒有給出說法,更沒有提供標準供大家參考。僅有 Go 語言項目技術負責人 Russ Cox 在一個開源項目的 issue 中給出了他關於 Go 項目結構的最小標準佈局的想法 [1]。熟悉我的博客 / 公衆號的讀者可能會知道,關於 Go 項目目錄佈局,我在以往文章中曾 ⌘ Read more
Go 語言封裝藝術:代碼安全與結構清晰**
Go 語言封裝簡介及實現細節\\*一、概述封裝是面向對象編程的三大特性之一, 可以隱藏實現細節, 對外提供簡單接口。在 Go 語言中,封裝是面向對象編程的核心概念之一,它允許將數據和方法組織起來,形成一個獨立的單元,提供對外部的良好接口。本文將探討 Go 語言中封裝的概念及其實現細節。將介紹封裝的基本原則,包括私有變量、方法、接口等,以及如何通過封裝提高代碼的可維護性和安全性。主要內容包括: 封裝概 ⌘ Read more
Go 語言包管理不再痛,包引用問題徹底解決**
Go 語言包的基本概念\\*一、概述Go 語言的包(package)系統是其強大功能和清晰結構的基石。包不僅僅是一種組織代碼的方式,更是 Go 語言中模塊化、複用和命名空間管理的關鍵。主要內容包括 模塊和包的基本概念 包的結構和命名 包的可見性和導出規則 自定義包的使用 包的初始化 包的別名和點操作 vendor 目錄和包的版本管理 包的測試 包的使用 ⌘ Read more
沒想到 Go 實現排序二叉樹如此簡單!**
1、概述排序二叉樹,也稱爲二叉搜索樹,是一種經典的數據結構。它不僅是一種二叉樹,還滿足左子樹的所有節點值小於根節點,右子樹的所有節點值大於根節點的條件。這個特性使得排序二叉樹具有高效的搜索、插入和刪除操作。2、排序二叉樹的基本概念排序二叉樹(Binary Search Tree,BST)是一種二叉樹,它的每個節點包含一個鍵值,同時滿足左子樹的所有節點值小於該節點的值,右子樹的所有節點值大於該節點的 ⌘ Read more
Golang 一文讀懂一致性 Hash 算法**
虛構場景:我們有 10 億張圖片,存在了 1000 臺服務器上,圖片命名格式爲 年份 4 位[毫秒時間戳 13 位],圖片信息存儲在了 MySQL 數據庫中,現在爲了提高圖片的查找速度,請幫我們設計一套圖片緩存系統,前期先給 10 臺服務器,每臺服務器可以存儲 100 萬張圖片,請設計一種算法,可以實現圖片快速查找?我們分析一下,首先,有 10 臺服務器,每臺服務器可存儲 100 萬張圖片,總計可 ⌘ Read more
沒想到 Go 語言實現堆代碼竟如此簡潔!**
概述在計算機中,堆(Heap)是一種基礎數據結構,廣泛應用於各種算法和問題解決中,比如堆排序、圖算法、調度算法等。Go 語言作爲一門強大的編程語言,提供了豐富的標準庫和強大的併發支持,也具備了靈活的數據結構和算法實現能力。本文將深入探討在 Go 語言中實現堆的方法,從基本概念到實際代碼演示,帶你一步步瞭解堆的原理和實現。堆的基本概念在計算機中,堆是一種特殊的樹形數據結構,它滿足堆屬性:對於每個節點 ⌘ Read more
在 Golang 中掌握併發和 Goroutines
學習 Golang 中的併發--------------併發是現代編程中的一個強大方面,它允許開發人員同時處理多個任務,充分利用多核處理器並增強應用程序的性能。在 Golang 中,通過 Goroutines 的概念,實現了簡單而高效的併發。本文深入探討了 Golang 中的併發世界,涵蓋了三個主要方面 - 使用 Goroutines 處理併發、使用通道和互斥鎖進行同步,以及管理 Goroutin ⌘ Read more
Go 語言基礎之結構體(夏日篇)**
前言--Hey,大家好呀,我是星期八,上文講述了引入了一些結構體的知識。但是我們知道 Go 是通過結構體模仿對象的,一起來看看吧。引言--在 Go 中,我們是沒有類這個概念的,但是我們有結構體呀~Go 中的結構體,就相當於其他語言的類,基本能實現和其他語言一摸一樣的操作。構造函數----構造函數,跟其他語言一樣了,官方理解就是在類實例化時執行的方法,通常用於賦值操作。但是在 Go 中,可能不是太一 ⌘ Read more
Go 語言實現時間窗口限流器**
在這個互聯網快速發展的時代,服務端應用程序經常會受到大量的請求。然而,任何一個系統都是有處理能力的上限的。因此,爲了保證系統的穩定運行,我們需要對這些請求進行流量的控制。什麼是限流器        限流器是一種控制服務請求併發數的工具,防止服務因超負載而崩潰,賦予服務有限的處理能力。通常用在分佈式系統,通過分倉儲和減慢服務請求的方法去控制服務的併發量。        例如,如果一 ⌘ Read more
基於 Go 的緩存實現**
緩存是架構設計中的常用概念,本文基於 Go 實現了一個簡單的緩存組件,支持最基本的緩存操作。原文: Implementing Cache With Go[1] 客戶端 - 服務器緩存簡介概念緩存是計算機科學中的一個重要概念。設想某個組件需要訪問外部資源,它向外部源請求資源,接收並使用資源,這些步驟都需要花費時間。當組件再次需要資源時,可以再次請求資源,但這種方式從時間上考慮是比較低效的。相反, ⌘ Read more
Go 如何實現分佈式鎖**
分佈式鎖原則上是一種可以解決不同節點上的程序避免資源衝突的一種鎖。實現一個分佈式鎖可以有很多中方式,下面以 Redis 爲例,說明如何在 Go 中實現一個分佈式鎖。首先你需要一個 Redis 客戶端,這裏可以選擇 go-redis 庫,這是一個功能齊全的 redis 客戶端。安裝這個庫的命令是:go get -u github.com/go-redis/redis然後你可以使用下面的代碼實 ⌘ Read more
使用 Go 編寫乾淨的代碼:接受接口並返回結構**
編寫乾淨且可維護的代碼是軟件開發的關鍵方面。乾淨代碼的關鍵原則之一是接受接口並返回結構。本文探討了如何在 Go 中實現這一原則,以 UserRepository 爲例。接受接口和返回結構的好處------------通過接受接口和返回結構,我們在 Go 代碼中實現了多個好處。遵循此原則使 Go 代碼更加整潔、可維護和靈活:1. 解耦:實現可以輕鬆替換,而不影響代碼的其他部分。 2. 可測試性 ⌘ Read more
使用 Go 和 WebRTC data channel 實現端到端實時通信**
關於實時通信 (RTC,Real-Time Communication),我和大多數人一樣,是用的多 (比如網絡電話、音視頻會議等),但對 RTC 概念和其底層技術原理了解的卻不多。近期,一項目恰用到了 RTC 技術,我就順便翻閱了一些資料,並用 Go 建立了一個端到端數據通信的小 demo,這裏給大家分享一下。RTC 與 WebRTC---------------1.1 實時通信 (Real-T ⌘ Read more
Go 語言類型分支大法秒殺一切未知類型!**
Go 語言類型分支 (switch 判斷空接口中變量的類型)\\*一、概述Go 語言中通過類型分支 (switch 類型判斷語句) 可以判斷空接口抽象類型所包含的具體類型, 這爲處理未知具體類型提供了極大便利。本文將介紹 Go 語言類型分支的用法, 內容包括: 類型分支基本語法 變量類型判斷 備選語法形式 多類型判斷 接口類型查詢 類型分支好處 類型分支的實現原理 ⌘ Read more
*
基於 golang 從零到一實現時間輪算法**
0 前言近期計劃攻堅一個新的專題系列——如何基於 golang 從零到一實現 redis.這裏選擇的學習素材是 hdt3213 大佬於 github 上開源的 godis 項目. 在大佬的實現中,充分利用了 golang 的特性,將 redis 存儲層由單線程模型轉爲併發模型,其中在實現數據的 expire 機制時,採用的是單機時間輪模型進行過期數據的刪除操作.godis 項目開源地址:http: ⌘ Read more
快速掌握 Go 工作區模式**
大家好,我是煎魚。在 Go 項目的模塊管理中,先是 GOPATH,然後到廢棄。再到強推 Go modules,從被社區抗拒到 rsc 硬上弓。現在最新要了解的,就是工作區模式(workspace mode)。這是一個在 Go1.18 引入的重要特性。之前一直沒提過,今天補全這塊的知識點。背景--在 Go1.11 起有了 Go modules 後,看起來 Go 模塊管理逐步按序有了約束、規範了起來。 ⌘ Read more
一文詳解 Go 語言接口嵌套組合的精髓!**
/ Go 語言接口的嵌套組合 /一、概述接口是 Go 語言中非常重要的一個類型, 可以用來定義方法集合。接口嵌套組合可以實現接口的複用以及擴展新接口。本文將圍繞 Go 語言接口的嵌套與組合進行講解, 內容包括: 接口嵌套基本用法 嵌套接口實現 多重嵌套接口 接口組合示例 組合接口實現 組合接口語法細節 嵌套組合的最佳實踐 實際應用場景 通過本文的學習, ⌘ Read more
介紹 Go 1-21 中的 slog 包:簡化的結構化日誌**
作爲 Go 1.21 版本的一部分,一個新的包 slog 被引入到核心庫中,旨在提供一個高級的、結構化的日誌機制。讓我們深入探討這個包及其如何增強您在 Go 應用程序中的日誌記錄能力。概覽--slog包旨在引入結構化日誌,其中日誌記錄包括消息、嚴重性級別和鍵值對,從而允許一個更爲描述性和可管理的日誌系統。核心功能----不同的嚴重性級別:日誌類型帶有各種方法,如Logger.Info和Logger ⌘ Read more
Golang 使用熔斷器提高你的系統的健壯性**
應用程序在執行訪問遠程資源和服務的操作時,這些操作可能會由於暫時性故障(例如網絡連接速度慢、超時或資源過載或暫時不可用)而失敗。這些錯誤通常會在短時間內自行糾正,並且應準備好使用諸如重試模式所述的策略來處理這些錯誤。但是,也可能存在以下情況:故障是由於不太容易預測的意外事件引起的,並且可能需要更長的時間來糾正。這些故障的嚴重程度從部分連接中斷到服務完全失敗不等。在這些情況下,應用程序不斷重試執行不 ⌘ Read more
在 Golang 中玩轉依賴注入 - dig 篇**
什麼是依賴注入?有時候一個結構體非常複雜,包含了非常多各種類型的屬性,這些屬性又包含了更多的屬性,當我們創建這樣一個結構體時需要編寫大量的代碼。面向接口編程可以讓我們的代碼避免耦合更具擴展性,但統一更換接口實現時需要大範圍的修改代碼。依賴注入幫助我們解決類似的問題,依賴注入框架能夠自動解析依賴關係,幫助我們自動構建結構體實例。依賴注入可以對接口注入實例,讓整個代碼系統不用關注具體的接口實現。由於 ⌘ Read more
Go - OpenCV 實現人臉識別**
作者:掘金——吳佳浩  https://juejin.cn/post/7259298176523141181引言--OpenCV 是一個強大的計算機視覺庫,提供了豐富的圖像處理和計算機視覺算法。在 Mac 上安裝 OpenCV 可以通過 Homebrew 進行簡單快捷的安裝。一旦安裝完成,我們可以使用 Go 的 OpenCV 綁定庫來實現人臉識別等計算機視覺任務。本文將向你介紹在 Mac ⌘ Read more
從零開始,手把手教你用 Go 語言實現日誌系統**
/ Go 語言實現日誌系統 (支持多種輸出方式) /隨着業務規模的擴大, 日誌系統的重要性日益凸顯。然而興起於編譯時的 Go 語言, 缺乏動態特性, 構建靈活的日誌系統似乎不那麼容易。本文將通過一個日誌系統的實現案例, 來剖析如何運用 Go 語言的接口、組合等機制, 實現一個功能完備、可定製的日誌系統。主要內容如下 1. 日誌系統概述 2. 日誌級別 3. 日誌輸出位置 ⌘ Read more
使用 Makefile 構建你的 Go 項目**
作者:掘金——Pokeya https://juejin.cn/post/7241395886856028197 Makefile 是一個強大且靈活的構建工具,具備自動化構建、處理依賴關係、任務管理和跨平臺支持等優點。通過編寫和使用 Makefile,開發者可以簡化項目的構建過程,提高開發效率,並實現自動化的構建和發佈流程。 在許多開源項目和工具中,Makefile 被廣泛選擇作 ⌘ Read more
Go 官方新玩具:漏洞管理和掃描,看看自己項目有沒有坑?**
大家好,我是煎魚。業務系統的安全問題一直是各企業的 “頭號” 問題(被發現時)。不知道有多少讀者朋友們經歷了剛剛結束的 HW 行動。最近發現有廠商已經可以對 Go 開始做檢測了,這又是一大進步。這不,最近發現 Go 官方自己推出了新的工具,作用是漏洞管理,告訴你已報告的漏洞,並告知你應該如何升級到什麼版本。今天這篇文章就是分享這個安全工具。前置的版本要求是:Go = 1.18。govulnch ⌘ Read more
=
Go 語言接口聲明規範和最佳實踐**
/ Go 語言接口聲明 (定義) 詳解 /一、概述接口是 Go 語言中一個非常重要的類型, 它定義了一個對象的行爲規範。正確理解和聲明接口對於用好 Go 語言是非常重要的。本文將介紹 Go 語言中接口的聲明與定義方法。主要內容包括: 接口基本概念 接口聲明格式 方法集合並 接口嵌套組合 接口定義指南 擴展已有接口 根據需求設計接口 設置接口方法規範 ⌘ Read more
Go 語言事件系統設計解析:發佈 - 訂閱模式實戰**
/ Go 語言使用事件系統實現事件的響應和處理 /一、概述事件系統是一種代碼組織模式, 可以實現松耦合的事件處理邏輯。在 Go 語言中, 可以通過事件系統來設計事件觸發、監聽和響應的機制。本文將介紹在 Go 語言中如何設計事件系統, 並實現事件監聽與響應的處理。主要內容包括 事件系統設計模式 接口封裝事件 事件發佈器實現 監聽器註冊 同步阻塞處理事件 異步隊列處理事 ⌘ Read more
Golang 高性能編程實踐**
作者:coly go 中高性能編程是一個經久不衰的話題,本文嘗試從實踐及源碼層面對 go 的高性能編程進行解析。1. 爲什麼要進行性能優化服務上線前,爲什麼要進行壓測和性能的優化?一個例子,content-service 在壓測的時候發現過一個問題: 舊邏輯爲了簡化編碼,在進行協議轉換前,會對某些字段做一個 DeepCopy,因爲轉換過程需要原始數據,但我們完全可以通過一些處理邏輯的調整,比如調 ⌘ Read more
PGO: 爲你的 Go 程序提效 5-
PGO (基於 profile 指導的優化) 在 Go 1.20 中還屬於預覽狀態, 在 Go 1.21 中已經生產可用了, 未來 PGO 還有很宏偉的目標 [1],但是現在已經可以很好的幫助我們提高程序的性能呢,根據程序的不同,可能會帶來 2% ~ 7% 的提升,不要小看這個提升,如果你是在大廠做優化的專家,可以這樣計算: “我廠大概有 10 萬 Go 實例,每個實例平均佔用 16 個核,通過我 ⌘ Read more~
用 Go 編寫簡潔代碼的最佳實踐**
介紹 簡潔的代碼對於創建可維護、可閱讀和高效的軟件至關重要。Go 是一種強調簡單和代碼整潔的語言。在本文中,我們將結合代碼示例,探討編寫簡潔 Go 代碼的最佳實踐。有意義的變量和函數名稱使用能表達變量和函數用途的描述性名稱。避免使用隱晦或過於簡短的名稱。// Bad:func fn(x int) int { // ...}// Good:func calculateFactorial(nu ⌘ Read more
GO 語言併發編程入門:Goroutine、Channel、Context、併發安全、GMP 調度模型**
作者:Pistachiout https://juejin.cn/post/72659397987947643221.GO 併發介紹---------併發:多線程程序在一個核的 cpu 上運行。並行:多線程程序在多個核的 cpu 上運行。由上可知併發不是並行,並行是直接利用多核實現多線程的運行,併發則主要由切換時間片來實現” 同時” 運行,go 可以設置使用核數,以發揮多核計算機的能力。 ⌘ Read more
Go 編譯器技術死碼消消樂**
一、前言死代碼消除( dead code elimination, 縮寫 DCE )是用來移除對程序執行結果沒有任何影響的代碼,以此 減少程序的體積大小 ,並且還可以避免程序在執行過程中進行一些不必要的運算行爲,從而 減少執行時間 。需要注意的是,除了不會執行到的代碼( unreachable code ),一些只會影響到無關程序執行結果的變量( dead variables ),也屬於死碼( d ⌘ Read more
Go 幾種讀取配置文件的方式**
比較有名的方案有使用 viper 管理配置 [1]----------------- 支持多種配置文件格式,包括 JSON,TOML,YAML,HECL,envfile,甚至還包括 Java properties 支持爲配置項設置默認值 可以通過命令行參數覆蓋指定的配置項 支持參數別名 viper[2] 按照這個優先級(從高到低)獲取配置項的取值:explicit ⌘ Read more
探究 Go 的高級特性之 【處理 1 分鐘百萬請求】**
作者:Goland 貓  https://juejin.cn/post/7245919919223636023 對於大型的互聯網應用程序,如電商平臺、社交網絡、金融交易平臺等,每秒鐘都會收到大量的請求。在這些應用程序中,需要使用高效的技術來應對高併發的請求,尤其是在短時間內處理大量的請求,如 1 分鐘百萬請求。同時,爲了降低用戶的使用門檻和提升用戶體驗,前端需要實現參數的無感知傳遞。這樣 ⌘ Read more
一篇文章帶你瞭解 Go 語言基礎之 map
前言--Hey,大家好呀,我是星期八,這次咱們繼續學習 Go 基礎之 map 扒。回憶往事----在上述的多個文章中,我們學習了數據類型,數組,切片等幫助我們存儲數據。尤其是是切片,可以存儲多個東西,並且可以靈活的增刪改查。但是切片仍然有不太方便的地方。比如學生,一個學生的信息是多個的,例如姓名,身高,體重,年齡等。如果使用切片,我們可能是這樣存儲的。package mainimport "fmt ⌘ Read more
Golang MQTT 的使用 實現發佈訂閱**
Eclipse Paho MQTT Go Client 爲 Eclipse Paho 項目下的 Go 語言版客戶端庫,該庫能夠連接到 MQTT Broker 以發佈消息,訂閱主題並接收已發佈的消息,支持完全異步的操作模式。官方源代碼地址: github.com/eclipse/paho.mqtt.golangGo 應用使用 mqtt 通信協議的時候, 是作爲 client 端使用的, server ⌘ Read more
Go 1-21 的新特性: 切片和映射**
sliceContains--------before func ContainsBefore(numbers []int, n int) bool { for , number := range numbers { if number n { return true } } return false}after import "slices"...slices.Cont ⌘ Read more
=
Golang 實用進階工具**
gotests[1] Generate Go tests from your source code.go get -u github.com/cweill/gotests/... gotests -hUsage of gotests:  -all        generate tests for all functions and methods  -excl string ⌘ Read more
電腦用 GoLand 太卡,記錄下自己把 VsCode 定製成 Go IDE 的步驟和過程**
同學們,不知道你們有多少人 IDE 是用 VsCode 的,我說說我吧,我一直都是用的 JetBrains 家的全家桶,GoLand 寫 Go 項目、IDEA 寫 Java 項目。 一開始是全用 IDEA,後來發現這玩意項目開多了是真佔內存,就退而求其次變成了寫 Go 的時候用 GoLand。無奈我最近發現公司給我配的這個電腦,今年是越來越不行,GoLand 開多了也卡,那就只好研究研究怎麼讓 V ⌘ Read more
slog 實戰:文件日誌、輪轉與 kafka 集成**
《slog 正式版來了:Go 日誌記錄新選擇![1]》一文發佈後,收到了很多讀者的反饋,意見集中在以下幾點:基於 slog 如何將日誌寫入文件 slog 是否支持 log 輪轉 (rotation),如果 slog 不支持,是否有好的 log 輪轉插件推薦? 如何與 kafka 集成 日誌輸出有哪些最佳實踐 這篇文章就是對上述問題進行補充說明的,供大家參考,希望能給大家帶去 ⌘ Read more
一致性哈希算法原理解析**
0 前言本期和大家一起分享一個設計思路非常巧妙的負載均衡策略——一致性哈希算法.本系列分爲理論篇和實戰篇兩部分:• 本篇是理論篇,和大家一起探討一致性哈希算法的技術原理 • 下週推出實戰篇,屆時我會基於 Golang 手寫實現出一個分佈式版本的一致性哈希 lib 庫,並會把相應的內容開源掛載在 github 上. 本期理論篇的分享大綱如下:1 問題背景在正式開講一致性哈希算法之前,我們 ⌘ Read more
Golang Interface 詳解(下)**
iface 和 eface 的區別-----------------  在 Go 語言中,iface 和 eface 是表示接口類型和空接口類型的內部數據結構。  iface 表示一個具體的接口類型,包含了指向接口表的指針和指向數據的指針。接口表中存儲了該接口類型的方法集信息,數據指針則指向實現了該接口的具體類型的值。  eface 則是一個空接口類型,包含了指向類型信息的指針和指向數據的指針。它 ⌘ Read more
編譯 Go 應用的黑盒挑戰:無源碼只有- a 文件,你能搞定嗎?**
上週末,一個 Gopher 在微信上與我交流了一個有關 Go 程序編譯的問題。他的述求說起來也不復雜,那就是合作公司提供的 API 包僅包括 golang archive(使用 go build -buildmode=archive 構建的. a 文件),沒有 Go 包的源碼。如何將這個. a 鏈接到項目構建出的最終可執行程序中呢?對於 C、C++、Java 程序員來說,僅提供靜態鏈接庫或動態鏈接 ⌘ Read more
=
一篇文章帶你瞭解 Go 語言基礎之函數(下篇)**
前言--Hey,大家好呀,我是星期八,這次咱們來學習一下函數的最後一些知識,快來上車叭。之前已經分享了:一篇文章帶你瞭解 Go 語言基礎之函數(上篇)、一篇文章帶你瞭解 Go 語言基礎之函數(中篇),沒趕上車的小夥伴去看看吧。上次主要回顧------上述我們知道,定義一個函數,可以將函數內存分配理解如下。同時我們也知道,無論進行什麼操作,只會操作棧上面的值。 函數和變量-----函數名即變量不知 ⌘ Read more
一篇文章帶你瞭解 Go 語言基礎之函數(中篇)**
前言--Hey,大家好呀,我是星期八,上篇文章學了些基礎:一篇文章帶你瞭解 Go 語言基礎之函數(上篇),這次咱們繼續學習 Go 基礎之函數進階叭。Go 函數內存分配圖----------Go 的函數內存分配,有點像堆分配,有點像,但是本質不是。可以理解像堆內存一樣,棧中保存的是堆的地址。 驗證代碼package mainimport "fmt"func say() string { re ⌘ Read more
Go: 異或運算的妙用**
概述--異或運算 通過對兩個相同長度的二進制數進行逐位比較,若對應位的值不同,結果爲 1, 否則結果爲 0, Go 語言中使用的運算符號爲 ^。下面舉幾個簡單的小例子:0 ^ 0 = 00 ^ 1 = 11 ^ 0 = 11 ^ 1 = 0圖片來源: https://www.build-electronic-circuits.com/xor-gate/運算定律----交換律 x ^ y = y ⌘ Read more
=
Go 開發:如何封裝函數來統計執行時間**
當我們談到在 Go 語言中計算函數執行時間時,有一系列重要的概念和技術需要了解。在這篇文章中,我們將逐步介紹如何測量和優化函數執行時間,以及在不同場景中的應用。文章主要內容 1. time.Now() 的用法 2. 計算執行時間的原理 3. 封裝時間統計函數 4. 時間統計錯誤用法解析 5. 化時間統計代碼 6. 測試包內置執行時間統計 7. 計 ⌘ Read more
深入理解 Go 語言 — 併發控制**
Go 語言以其優雅的併發模型而聞名。我們一起考慮這樣一種場景,協程 A 在執行過程中需要創建子協程 A1、A2、A3…An,協程 A 創建完子協程後就等待子協程退出,爲了處理這三種場景,Go 提供了三種解決方案,並且這三種方案各有優劣:Channel:使用 channel 控制子協程,優點是實現簡單,清晰易懂。 WaitGroup:使用信號量機制控制子協程,優點是子協程個數可以動態調整。 ⌘ Read more
go-zero 的自適應熔斷器**
熔斷和限流還不太一樣,限流是控制請求速率,只要還能承受,那麼都會處理,但熔斷不是。在一條調用鏈上,如果發現某個服務異常,比如響應超時。那麼調用者爲了避免過多請求導致資源消耗過大,最終引發系統雪崩,會直接返回錯誤,而不是瘋狂調用這個服務。本篇文章會介紹主流熔斷器的工作原理,並且會藉助 go-zero 源碼,分析 googleBreaker 是如何通過滑動窗口來統計流量,並且最終執行熔斷的。工作原理- ⌘ Read more
Go 語言設計模式之裝飾模式**
裝飾模式算是一種很好理解的設計模式了,相信接觸過設計模式的同學都會對這種模式印象深刻,但是可能你不知道,裝飾模式在業界的應用也非常的廣泛,遠超你的想象,讓我們來一起看看吧。模式介紹裝飾模式(Decorator Pattern)它的定義是這樣的:Attach additional responsibilities to an object dynamically keeping the same i ⌘ Read more
Go 語言函數實現接口的 N 個實踐技巧**
/ Go 語言函數類型實現接口手冊 /函數是 Go 語言中非常重要的類型, 它也可以直接實現接口, 這爲我們提供了一種更簡潔優雅的編程方式。本文將剖析 Go 語言中的函數類型如何實現接口。本文主要內容如下 1. 接口定義 2. 函數實現接口 3. 通過接口調用函數 4. 不同函數實現同一接口 5. 函數帶接收者也可以實現接口 6. 空接口實現 7. ⌘ Read more
gin 上使用 Grpc 入門**
要在 Go 中使用基於 Gin 的 gRPC,你需要執行以下步驟:安裝 gRPC:使用以下命令安裝 gRPC: go get -u google.golang.org/grpc安裝 protoc-gen-go:使用以下命令安裝 protoc-gen-go 插件,它用於將 protocol buffer 文件生成 Go 代碼: go get -u github.com/golang/pr ⌘ Read more
go 實現判斷當兩個參數確定時- 第三個參數必須是唯一的**
表格數據\\| appid \\| 參數名稱 \\| 參數值 \\| 參數值名稱 \\|\\| --- \\| --- \\| --- \\| --- \\|\\| 100074 \\| qwe12345 \\| mao11 \\| 超超 1 \\|\\| 100074 \\| ssss \\| mao3 \\| 超超 1 \\|\\| 100074 \\| qwe12 \\| ma01 \\| 超超 2 \\|\\| 100074 \\| www \\| mao3 \\| 超超 3 \\|\\| 100074 \\| w ⌘ Read more
深入理解 Go 語言 — 協程和調度**
在今天的編程世界中,協程已經成爲了構建併發程序的重要工具。協程提供了一種在單個線程中處理多個任務的強大機制。而在 Go 語言中,協程的概念被引入爲 “goroutine”,並作爲語言核心特性之一。在本文中,我們將深入探討 Go 語言中的協程及其調度機制。一、協程的概念協程並不是 Go 發明的概念,維基百科上記錄,協程術語 coroutine 最早出現在 1963 年發表的論文中,論文的作者爲美國計 ⌘ Read more
Go 扒一扒 sort 工具包底層用的哪些排序算法?**
一、前言 平時工作中業務代碼中很多地方需要進行排序操作,go 標準庫中是提供了 sort 包是實現排序功能的,接下來來扒一扒 sort 的排序功能到底如何實現的?這裏先介紹 2 個概念:穩定排序和不穩定排序的區別, 如下:舉例:對一個數組進行排序,如果裏面有重複的數據,排完序時候,相同的數據的相對索引位置沒有發生改變,那麼就是穩定排序。也就是裏面有兩個 5,5。排完之後第一個 5 還在最前面,沒 ⌘ Read more
Go 每日一庫之 vegeta — http 壓力測試工具庫**
今天給大家推薦的是一個對 HTTP 接口做壓力測試的工具:vegeta。 項目地址:https://github.com/tsenart/vegeta一、特點----命令行和 Go 第三方庫都可以使用 命令行使用 UNIX 風格設計 可擴展多種壓測報告形式 對於分佈式測試也非常簡單易用 易安裝、易使用 二、安裝----2.1 MacOS 下安裝macos 下使用 b ⌘ Read more
Go 語言中排序的 3 種方法**
在寫代碼過程中,排序是經常會遇到的需求,本文會介紹三種常用的方法。廢話不多說,下面正文開始。使用標準庫-----根據場景直接使用標準庫中的方法,比如:sort.Ints sort.Float64s sort.Strings 舉個例子:s := []int{4, 2, 3, 1}sort.Ints(s)fmt.Println(s) // [1 2 3 4]自定義比較器------使 ⌘ Read more
=
Go GC:瞭解便利背後的開銷**
簡介-----當今,移動互聯網和人工智能的快 (越) 速(來)發 (越) 展(卷),對編程語言的高效性和便利性提出了更高的要求。Go 作爲一門高效、簡潔、易於學習的編程語言,受到了越來越多開發者的青睞。Go 語言的垃圾回收機制(Garbage Collection,簡稱 GC)是其重要的運行機制之一,它可以幫助開發人員避免手動管理內存的複雜性和錯誤,爲開發者帶來開發上的便利,使開發者可以更專注於業 ⌘ Read more
萬字長文深入淺出 Golang Runtime
介紹------本文主要內容如下:Golang Runtime 是個什麼? Golang Runtime 的發展歷程, 每個版本的改進Go 調度: 協程結構體, 上下文切換, 調度隊列, 大致調度流程, 同步執行流又不阻塞線程的網絡實現等Go 內存: 內存結構, mspan 結構, 全景圖及分配策略等Go GC: Golang GC 停頓大致的一個發展歷程, 三色標記實現的一些細節, 寫屏障, 三 ⌘ Read more
zap 高性能設計與實現**
概述\\-\\- zap 是 Uber 開源的 Go 高性能日誌庫,性能遠超於標準庫和其他開源日誌庫。zap 使用簡單,支持多種格式結構化日誌、可以設置不同的日誌級別,並且能夠在堆棧跟蹤中記錄調用者信息。爲什麼要使用 zap\\| 功能 / 庫 \\| 標準庫 log \\| zap \\|\\| --- \\| --- \\| --- \\|\\| 日誌級別 \\| 只有 Print 在生產可用,因爲 Fatal 級別會終止進程,Panic ⌘ Read more
golang 使用信號量併發安全的遷移千萬條數據**
由於公司業務需要: 需將 PostgreSQL 數據庫中的 9 百萬條數據 遷移到 MySQL.現將遷移腳本的開發過程記錄如下:安裝驅動庫go get -u gorm.io/gormgo get -u gorm.io/driver/postgresgo get -u gorm.io/driver/mysql初始化數據庫連接import (  "gorm.io/driver/postgres"  " ⌘ Read more
從零到一搭建 TCC 分佈式事務框架**
0 前言在寫這篇文章的過程中,我在另一邊並行完成了一個開源項目的搭建. 這個項目是基於 golang 從零到一實現的 TCC 分佈式事務框架,當前於 github 的開源地址爲:https://github.com/xiaoxuxiansheng/gotcc本期分享內容將會緊密圍繞着這個開源項目展開. 受限於個人水平,在項目實現以及文章講解中有着諸多不當之處,權當在此拋磚引玉,歡迎大家多多批評指正 ⌘ Read more
Go1-21 速覽:Context 可以設置取消原因和回調函數了,等的可太久了!**
大家好,我是煎魚。在 Go 中有一個很經典的設計:context,這是許多同學初學時必學的標準庫。涉及到上下文傳遞、超時控制等必要項。甚至在函數體中的第一個參數大多是傳 context。寫第三方庫也必須兼容 context 設置,否則會經常有人提需求讓你支持。我覺得這次的新特性更新雖不復雜,但作用挺大。建議大家學習!Context Demo------------以下是一個快速 Demo:pack ⌘ Read more
Go 1-21-0 新增 3 個內置函數詳解**
01 介紹Go 1.21.0 新增 3 個內置函數,min 和 max 函數,返回 N 個入參中最小 / 最大的參數,參數類型爲 Ordered(有序類型,即支持比較運算符的類型)。clear 函數,刪除 map 中的所有元素,將切片中的所有元素改爲切片類型的零值。本文我們詳細介紹 min、max 和 clear 的使用方式。02Min and max源碼/usr/local/go/src/bui ⌘ Read more
kafka-go 使用指南**
Go 操作 Kafka 之 kafka-goGo 社區中目前有三個比較常用的 kafka 客戶端庫 , 它們各有特點。首先是 IBM/saram(這個庫已經由 Shopify 轉給了 IBM),之前我寫過一篇使用 sarama 操作 Kafka 的教程,相較於 sarama, kafka-go 更簡單、更易用。segmentio/kafka-go 是純 Go 實現,提供了與 kafka 交互的低級 ⌘ Read more
藉助 gopsutil 庫,獲取機器相關信息**
使用 github.com/shirou/gopsutil/disk 這個庫,如何獲取機器下不同磁盤分區的內容 使用 github.com/shirou/gopsutil/disk 庫獲取機器下不同磁盤分區的內容,可按如下:import "github.com/shirou/gopsutil/disk"//調用 disk.Partitions() 函數獲取機器下所有磁盤分區的信息:partiti ⌘ Read more
Go 中的匿名函數與閉包**
閉包 與 普通函數的區別\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\- 在 (普通) 函數里面定義一個內部函數(匿名函數),並且這個內部函數 (匿名函數) 用到了外面 (普通) 函數的變量,那麼將這個內部函數和用到的一些變量統稱爲閉包在閉包中,既有函數,又有數據,而且 (其內部定義的) 數據是閉包裏面獨有的數據,與外界無影響; (普通) 函數中,需要使用的全局變量,在一定程度上是受到限制的,因爲全局變量不僅 ⌘ Read more
Golang 中的 defer
面試常問之 defer() 的執行次序情形 1package mainfunc main() {    defer print(123) defercall() defer print(789) //panic之後的代碼不會被執行 print("不會執行到這裏")}func defercall() { defer func() {  print("打印前") }() defer func() { ⌘ Read more
Go context-WithCancel-- 的使用**
WithCancel 可以將一個 Context 包裝爲 cancelCtx, 並提供一個取消函數, 調用這個取消函數, 可以 Cancel 對應的 ContextGo 語言 context 包 - cancelCtx[1] 疑問-- context.WithCancel() 取消機制的理解 [2]父母 5s 鍾後出門,倒計時,父母在時要學習,父母一走就可以玩package mainimp ⌘ Read more
Go 語言中的零拷貝**
傳統讀寫模式------傳統讀寫模式流程圖第一次數據拷貝: 用戶進程發起 read() 系統調用,當前上下文從用戶態切換至內核態,DMA(Direct Memory Access) 引擎從文件中讀取數據,並存儲到內核態緩衝區 (DMA 拷貝) 第二次數據拷貝: 將數據從內核態緩衝區拷貝到用戶態緩衝區 (CPU 拷貝),然後返回給用戶進程,拷貝數據時會發生一次上下文切換 (從內核態切換到用戶態 ⌘ Read more
go 的 net-http 有哪些值得關注的細節?**
golang 的net/http庫是我們平時寫代碼中,非常常用的標準庫。由於 go 語言擁有 goroutine,goroutine 的上下文切換成本比普通線程低很多,net/http 庫充分利用了這個優勢,因此,它的內部實現跟其他語言會有一些區別。其中最大的區別在於,其他語言中,一般是多個網絡句柄共用一個或多個線程,以此來減少線程之間的切換成本。而 golang 則會爲每個網絡句柄創建兩個 go ⌘ Read more
Go 語言讀取文件的幾種方式**
前言這篇文章將討論如何在 Golang 中讀取文件。我們將使用以下包來處理這些文件。os(https://pkg.go.dev/os) 包提供了一個獨立於平臺的接口來執行操作級操作。 IOutil(https://pkg.go.dev/io/ioutil) 軟件包提供了易於使用的實用程序函數來處理文件,而無需瞭解太多內部實現。 bufio(https://pkg.go.dev/bufiRead more
Go 異常處理機制 panic 和 recover
recover------- 使用 panic 拋出異常後, 將立即停止當前函數的執行並運行所有被 defer 的函數,然後將 panic 拋向上一層,直至程序 crash。但是也可以使用被 defer 的 recover 函數來捕獲異常阻止程序的崩潰,recover 只有被 defer 後纔是有意義的。func main() { print(123) print(456) panic("thr ⌘ Read more
如何使用 Golang 的 Gin 框架渲染 HTML 頁面**
使用 Golang 流行的 web 框架 Gin 渲染 HTML 模板頁面的簡單例子Gin 是 Golang 最流行的 web 框架之一。我之前已經寫過如何使用 Golang 基礎模板包渲染 HTML 頁面。使用 Gin 渲染 HTML 模板更加簡單。爲了使工作流更加順暢,嘗試新的想法並進行調試,我還決定使用 Codegangsta 的自動重載工具 Gin。安裝 Gin安裝 Gin HTTP ⌘ Read more
Golang 怎麼實現禁止拷貝**
一、前言禁止拷貝即是用戶無法對對象進行拷貝,比如源碼包中的 sync.waitgroup,就是不可以拷貝的。二、如何實現禁止複製查看 sync 包下的源碼得知看一下 go 的源碼如何實現禁止拷貝的,如下:type noCopy struct{}// Lock is a no-op used by -copylocks checker from go vet.func (noCopy) Lock() ⌘ Read more
又有新功能!Go 將有生成新模板的 gonew 工具鏈**
大家好,我是煎魚。不知道大家平時在日常工作中,會不會遇到一個問題?公司用着微服務架構,經常要創建新的服務,需要一個應用模板去初始化新的服務,減少 ctrl+c+v,轉爲相對自動化。不同團隊根據 Leader 的喜好、要求不同,應用模板又會不同。有的喜歡 DDD、有的喜歡 MVC、有的大道至簡即可。每家公司都會延伸出一個工具鏈做這個事情。新工具:gonew 生成模板--------------在 G ⌘ Read more
真實世界的 Go 設計模式 - 適配器模式**
在設計模式中,適配器模式(adapter pattern)有時候也稱包裝模式或者包裝(英語:wrapper)。將一個類的接口轉接成用戶所期待的。一個適配使得因接口不兼容而不能在一起工作的類能在一起工作,做法是將類自己的接口包裹在一個已存在的類中。 這個模式很容易記住,每次看到它我就想起世界各地各種不同的電源插頭標準,五花八門,但是你拿一個筆記本到處出差的話,怎麼辦呢?總不能拿十幾個插頭吧,所以有一 ⌘ Read more