博客 / 列表

soroqer - Go語言面向對象特性之--多態與繼承的實現機制

最近突然想起來過去寫過的 C++ 與 Java,索性探討一下,Golang 是不是面嚮對象語言,是否有其標誌性的多態與繼承? 1. 引言 面向對象編程的核心範式圍繞封裝、繼承與多態展開。傳統語言(如Java、C++)通過類與繼承體系實現這一目標:類定義數據結構與方法,繼承建立類型層級,多態通過父類引用指向子類實例實現。Go語言在設計初期即明確拒絕傳統類繼承模型,其官方文檔指出:“Go不是傳統意義上

組合 , 多態 , 繼承 , 接口 , go

soroqer - Map 的源碼分析、內存分配、擴容機制-Golang 🔥

Go 語言的 map 是內置的鍵值對(Key-Value)集合類型,是基於哈希表實現的高效數據結構,用於高效存儲和查找數據。其核心特性如下: 無序性:map 中的鍵值對存儲順序不固定,無法通過索引訪問(區別於切片)。 鍵唯一性:鍵(Key)必須唯一,重複插入同一鍵會覆蓋舊值。 動態大小:map 會根據存儲的數據量自動擴容,無需手動管理內存。 通過深入理解 map 的源碼和內存分配,開發者

內存分配 , map , 擴容 , 源碼分析 , go

soroqer - Channel 的源碼分析與高效使用-Golang 🔥

“不要通過共享內存來通信,而要通過通信來共享內存”。這句話精準概括了 Go 併發模型的核心哲學——而承載這一哲學的核心原語,正是 channel(通道)。 要深入理解 channel,我們需要從 runtime 包的源碼層面分析其核心結構、關鍵操作(創建、發送/接收、關閉)的實現邏輯,以及底層如何通過同步機制(鎖、等待隊列)實現協程(Goroutine)間的安全通信。 以下源碼基於 go1.24.

channel , 效率 , 源碼分析 , go

soroqer - Rust 和 Go 在多線程的對比

1. Go 的 Goroutine:輕量且高效 Goroutine 是 Go 中非常核心的併發單元。它是 用户級線程,由 Go 的運行時調度器管理,而不是由操作系統的內核調度。 輕量性: 內存佔用:每個 goroutine 的棧內存只有 2KB 左右,遠小於傳統線程的棧大小(一般為幾 MB)。這使得你可以輕鬆地創建成千上萬的 goroutines,而不會造成明顯的內存壓力。

rust , 多線程 , go

soroqer - WebSocket vs gRPC Stream:深度對比兩種流式通信技術

在實時通信與流式數據傳輸領域,WebSocket與gRPC Stream是最常被提及的兩項技術。本文將從協議設計、通信模型、適用場景等維度展開深度對比,幫助開發者理解兩者的本質差異與選擇邏輯。 一、前置知識:流式通信的核心需求 在分佈式系統中,流式通信主要解決兩類問題: 長連接實時交互:如聊天、監控數據推送、在線協作; 批量數據分塊傳輸:如大文件上傳/下載、日誌流同步、實時數據集同步。 W

grpc , websocket

soroqer - Array 與 Slice 的源碼分析與高效使用-Golang 🔥

在 Go 語言中,數組(array)和切片(slice)是兩種不同的數據結構,它們在內存分配機制上存在着顯著差異。深入理解這些差異及原理並恰當使用,能夠幫助我們提高代碼的執行效率。 在使用上,由於語法糖的存在,很多初學者對於二者並不敏感。數組的寫法是 [n]int,切片則是 []int,區別僅在於是否在 [] 中體現其長度。 從實現上講,slice 是 array 的一種封裝再實現,將長度不可變的

性能優化 , 內存 , 數組 , slice , go

soroqer - Goroutine 的創建與調度:從 GPM 模型到 go 關鍵字的底層邏輯

併發,對於每個語言來説都是最重要的一部分。Goroutine 採用 m:n 模型,是一種輕量化的多線程處理。 一、為什麼需要 Goroutine ? 在理解 Goroutine 之前,我們先回顧一下的傳統併發模型。在多數編程語言(如 Java、C++)中,併發主要依賴「線程」(Thread)實現。但線程存在兩個問題: 創建成本高:每個線程需要佔用獨立的棧空間(通常幾 MB),操作系統需要為線

goroutine , gmp

soroqer - select 的基本使用及其特性-Golang

在 Go 語言中,select 語句是專門用於監聽多個 Channel 操作的控制結構,其核心作用是協調多個 Channel 的讀寫事件,確保程序能高效響應任意一個 Channel 的就緒狀態。多與 for 循環配合使用,進行監聽。以下是其詳細用法和常見場景: 一、基本語法 select 的語法與 switch 類似,但每個 case 必須是一個 Channel 操作(發送或接收),且至少有一個

select , go

soroqer - []A 與 []*A 的內存分配、生命週期-Golang 🔥

一、內存分配 無論 []A 還是 []*A,切片本身的元數據(切片頭)結構是完全相同的。切片頭是一個包含 3 個字段的結構體: ptr:指向底層數組的指針(8 字節)。 len:切片長度(8 字節)。 cap:切片容量(8 字節)。 因此,切片頭本身佔用的內存大小 24 字節,內存完全一致。 切片的核心是底層數組,內存分配的核心差異源於底層數組的元素類型:[]A 存儲完整結構體實例,[]

生命週期 , slice , gc , 指針 , go

soroqer - unsafe.Pointer 與 uintptr-Golang

unsafe 包提供了繞過類型系統的底層內存操作能力,用於實現高性能、跨語言交互或底層數據結構。其中最核心的類型是 unsafe.Pointer 和 uintptr。 1、任意類型的指針:unsafe.Pointer unsafe.Pointer 是 Go 中唯一可以指向任意類型內存地址的指針類型,類似於 C 語言的 void*。它允許將任意類型的指針轉換為 unsafe.Pointer,並在不同

指針 , go