Go string 字符串底層邏輯

在 Go 語言中,string 類型的底層結構是一個結構體,包含兩個字段:一個指向字節數組的指針和該字節數組的長度。以下是其在 Go 源碼中的大致定義:
type stringStruct struct {str unsafe.Pointerlen int
}
str:這是一個指向字節數組的指針,該數組存儲著字符串的實際內容。
len:它表示字符串的長度,也就是字節數組中字節的數量。
當你創建一個字符串時,Go 語言會在內存里分配一塊連續的區域,用來存放字符串的字節序列。字符串一旦創建,其內容就不可變,而且這塊內存區域的大小等同于字符串的長度。
例如:
s := "hello"
在這個例子中,Go 語言會分配一塊大小為 5 字節的內存區域,用來存放字符串 "hello" 的字節序列。stringStruct 中的 str 指針會指向這塊內存區域的起始地址,len 字段的值則為 5。
當你修改字符串時,Go 語言會重新分配一塊內存區域,并將原來的字符串內容復制到新區域中。
例如:
s = s + " world"
在這個例子中,Go 語言會重新分配一塊大小為 11 字節的內存區域,并將原來的字符串 "hello" 的內容復制到新區域中,再追加上 " world" 字符串的字節序列。stringStruct 中的 str 指針會指向這塊內存區域的起始地址,len 字段的值則為 11。j

舉個例子測試下:

package mainimport ("fmt""unsafe"
)func main() {s := "hello"// 打印字符串的長度fmt.Printf("Length of s: %d\n", len(s)) // Length of s: 5// 打印字符串的底層結構strStruct := (*struct {str unsafe.Pointerlen int})(unsafe.Pointer(&s))fmt.Printf("Pointer to underlying data: %p\n", strStruct.str) // Pointer to underlying data:  0xa60caffmt.Printf("Length of underlying data: %d\n", strStruct.len)  // Length of underlying data: 5fmt.Printf(" %v,%v\n", &s, strStruct)                         // 0xc000026070,&{0xa60caf 5}// 嘗試修改字符串s = s + " world"// 打印新字符串的底層結構newStrStruct := (*struct {str unsafe.Pointerlen int})(unsafe.Pointer(&s))fmt.Printf("Pointer to new underlying data: %p\n", newStrStruct.str) // Pointer to new underlying data: 0xc00000a0e0fmt.Printf("Length of new underlying data: %d\n", newStrStruct.len)  // Length of new underlying data: 11fmt.Printf(" %v,%v\n", &s, newStrStruct)                             //  0xc000026070,&{0xc00000a0e0 11}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898109.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【NLP】10. 機器學習模型性能評估指標(含多類別情況), ROC,PRC

機器學習模型性能評估指標(含多類別情況) 1. 模型評估指標簡介 在機器學習中,模型的性能評估非常重要。常用的模型評估指標有: 準確率(Accuracy)精度(Precision)召回率&#xff0…

開源通義萬相本地部署方案,文生視頻、圖生視頻、視頻生成大模型,支持消費級顯卡!

開源通義萬相本地部署方案,文生視頻、圖生視頻、視頻生成大模型,支持消費級顯卡! 萬相2.1開源 近日,大模型萬相2.1(Wan)重磅開源,此次開源采用Apache2.0協議,14B和1.3B兩個參數規格…

機器學習與深度學習中模型訓練時常用的四種正則化技術L1,L2,L21,ElasticNet

L1正則化和L2正則化是機器學習中常用的兩種正則化方法,用于防止模型過擬合。它們的區別主要體現在數學形式、作用機制和應用效果上。以下是詳細對比: 1. 數學定義 L1正則化(也叫Lasso正則化): 在損失函數中加入權重參…

qt+opengl 播放yuv視頻

一、實現效果 二、pro文件 Qt widgets opengl 三、主要代碼 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…

Android開源庫——RxJava和RxAndroid

RxJava和RxAndroid是什么? RxJava是基于JVM的響應式擴展,用于編寫異步代碼 RxAndroid是關于Android的RxJava綁定 RxJava和RxAndroid使用 依賴 implementation io.reactivex.rxjava3:rxjava:3.1.0 implementation io.reactivex.rxjava3:rxandroid:3.…

并發基礎—三大問題:可見性、原子性、有序性

文章目錄 可見性原子性有序性(指令重排)經典的指令重排案例:單例模式的雙重檢查鎖volatile和synchronize都可以保證有序性并發壓測工具Jcstress證明指令重排會在多線程下出現問題(了解)CPU緩存分為三個級別&#xff1a…

PyTorch 入門學習

目錄 PyTorch 定義 核心作用 應用場景 Pytorch 基本語法 1. 張量的創建 2. 張量的類型轉換 3. 張量數值計算 4. 張量運算函數 5. 張量索引操作 6. 張量形狀操作 7. 張量拼接操作 8. 自動微分模塊 9. 案例-線性回歸案例 PyTorch 定義 PyTorch 是一個基于 Python 深…

Hive SQL 精進系列:REGEXP_REPLACE 函數的用法

目錄 一、引言二、REGEXP_REPLACE 函數基礎2.1 基本語法參數詳解2.2 簡單示例 三、REGEXP_REPLACE 函數的應用場景3.1 去除特殊字符3.2 統一字符串格式 四、REGEXP_REPLACE 與 REPLACE 函數的對比4.1 功能差異4.2 適用場景 五、REGEXP_REPLACE 與 REGEXP 函數的對比5.1 功能差異…

從0開始搭建微服務架構特別篇SpringCloud網關聚合knife4j

前言:總所周知項目開發接口測試需要knife4j,但是,微服務架構中微服務很多,模塊地址很多,需要統一管理api測試,就需要聚合在網關統一調用,本章,就說明如何通過網關聚合使用knife4j。 …

Spring Cloud 中的服務注冊與發現: Eureka詳解

1. 背景 1.1 問題描述 我們如果通過 RestTamplate 進行遠程調用時,URL 是寫死的,例如: String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 當機器更換或者新增機器時,這個 URL 就需要相應地變…

網頁制作15-Javascipt時間特效の記錄網頁停留時間

01效果圖: 02運用: window.setTimeout()刷新function()函數document.forms():表單if條件語句window.alert()窗口警示 03、操作代碼:…

【Rust基礎】排序和分組

排序 簡單排序 整數排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //?assert_eq!(list, vec![1, 2, 3, 4, 5]); }小數排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//? 不能直接使用sort,因為f32和f64未實現O…

C++ std::list超詳細指南:基礎實踐(手搓list)

目錄 一.核心特性 1.雙向循環鏈表結構 2.頭文件:#include 3.時間復雜度 4.內存特性 二.構造函數 三.list iterator的使用 1.學習list iterator之前我們要知道iterator的區分 ?編輯 2.begin()end() 3.rbegin()rend() 四.list關鍵接口 1.empty() 2. size…

996引擎 - 紅點系統

996引擎 - 紅點系統 總結NPC 紅點(TXT紅點)Lua 紅點1. Red_Point.lua2. UI_Ex.lua參考資料以下內容是在三端 lua 環境下測試的 總結 紅點系統分幾個部分組成。 M2中設置變量推送。 配置紅點表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填寫 ids 列。 主界面掛載…

C語言——變量與常量

C語言中的變量與常量:簡潔易懂的指南 在C語言編程中,變量和常量是最基本的概念之一。理解它們的區別和使用方法對于編寫高效、可維護的代碼至關重要。本文將詳細介紹C語言中的變量和常量,并通過圖表和代碼示例幫助你更好地理解。 目錄 什么…

PySide(PyQt),使用types.MethodType動態定義事件

以PySide(PyQt)的圖片項為例,比如一個視窗的場景底圖是一個QGraphicsPixmapItem,需要修改它的鼠標滾輪事件,以實現鼠標滾輪縮放顯示的功能。為了達到這個目的,可以重新定義一個QGraphicsPixmapItem類,并重寫它的wheelE…

K8S學習之基礎三十一:k8s中RBAC 的核心概念

Kubernetes (k8s) 中的 RBAC(Role-Based Access Control,基于角色的訪問控制)是一種用于管理用戶和服務賬戶對集群資源訪問權限的機制。RBAC 允許管理員通過定義角色(Role)和角色綁定(RoleBinding&#xff…

【eNSP實戰】三層交換機使用ACL實現網絡安全

拓圖 要求: vlan1可以訪問Internetvlan2和vlan3不能訪問Internet和vlan1vlan2和vlan3之間可以互相訪問PC配置如圖所示,這里不展示 LSW1接口vlan配置 vlan batch 10 20 30 # interface Vlanif1ip address 192.168.40.2 255.255.255.0 # interface Vla…

軟考系統架構師 — 1 考點分析

目錄 1 考點總結 1 考點總結 章節 內容 真題考察 緒論 1. 緒論 不考 計算機相關知識 2. 計算機系統基礎知識,新增計算機硬件、嵌入式、計算機語言、系統工程 對應計算機組成結構、操作系統、數據庫、計算機網絡、多媒體等知識點,整體分值在 10 …

在Eclipse 中使用 MyBatis 進行開發,通常需要以下步驟:

在Eclipse 中使用 MyBatis 進行開發,通常需要以下步驟: 1. 創建 Maven 項目 首先,在 Eclipse 中創建一個 Maven 項目。如果你還沒有安裝 Maven 插件,可以通過 Eclipse Marketplace 安裝 Maven 插件。 打開 Eclipse,選…