Go 語言基礎1 Slice,map,string

更多個人筆記見:
github個人筆記倉庫
gitee 個人筆記倉庫
個人學習,學習過程中還會不斷補充~ (后續會更新在github上)

文章目錄

  • stirng 字符串
    • 區分 rune,byte,string
    • 字符串操作
        • strings 庫相關
    • fmt.Printf語法
  • Slice 切片
        • 基礎知識
            • 數組和切片的區別
        • append函數
            • 通過append看切片和擴容
            • 通過 append 合并切片
        • 利用\[:]的方式制造切片
            • 截取示范
            • 截取的地址分析
        • := 賦值的影響
        • range 的使用
            • copy的使用
  • Map映射
        • 基本示例
        • map在并發讀寫中的問題
        • Map原理
            • map 結構

stirng 字符串

  • 求長度還是utf庫中求,因為中文有占3/4字節的,用len不準確
  • 符串和數組不能直接123 + “456”這樣拼接
    	con := fmt.Sprintf("123%d",456)println(con)
    

區分 rune,byte,string

package mainimport ("fmt"
)func main() {s := "hello world" //直接字符串形式for _, v := range s {fmt.Printf("value is %c,type is %T\n", v, v)//typeis:int32value (rune)}for _, v := range s {fmt.Println(v)  //是 int32 形式的數字//is int32vlaue (rune)fmt.Println(string(v))//string}tokens := []string{"2", "1", "+", "3", "*"} //用 string處理for i := 0; i < len(tokens); i++ {fmt.Printf("type is %T\n", tokens[i])//type is string}bytes := []byte("hello world")  //用 byte 處理for i := 0; i < len(bytes); i++ {fmt.Printf("value is %c,type is %T", bytes[i], bytes[i])//type is uint8fmt.Println(bytes[i])//value is 104,type is uint8}runes := []rune(s)for i := 0; i < len(runes); i++ {fmt.Printf("value is %c,type is %T\n", runes[i], runes[i])//value is h,type is runefmt.Println(string(runes[i]))//string}
}

總結:

  • 原始字符串之中 的內容每一個是 rune 存儲,rune 是 int32
  • byte 就是轉為 int8
  • string類型是不同于 rune 的,stirng 的列表中的類型就是 string 而不是 rune 的 int32

字符串操作

strings 庫相關

常用:

func main() {fmt.Println(strings.ToUpper("hello"))fmt.Println(strings.ToLower("HELLO"))fmt.Println(strings.Replace("hello world", "world", "go", -1)) //hello gofmt.Println(strings.Split("hel-lo-w-rld", "-"))  //[hel lo w rld]fmt.Println(strings.Join([]string{"hel", "lo", "w", "rld"}, "-")) //hel-lo-w-rld
}

fmt.Printf語法

//輸出形式
fmt.Printf("整數:%d\n", 123)      // %d:十進制整數
fmt.Printf("字符:%c\n", 'A')      // %c:字符
fmt.Printf("字符串:%s\n", "hello") // %s:字符串
fmt.Printf("布爾值:%t\n", true)    // %t:布爾值
fmt.Printf("浮點數:%f\n", 3.14)    // %f:浮點數
fmt.Printf("二進制:%b\n", 15)      // %b:二進制
fmt.Printf("十六進制:%x\n", 15)    // %x:十六進制(小寫) //類型相關
fmt.Printf("類型:%T\n", 123)       // %T:類型
fmt.Printf("值:%v\n", 123)         // %v:默認格式
fmt.Printf("Go語法:%#v\n", "hello") // %#v:Go語法格式
fmt.Printf("p=%+v\n", p) // p={x:1 y:2} 打印結構體字段和名
fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2} 打印更具體結構體名稱

Println 會自動回車,Printf 需要\n

Slice 切片

切片:定義,切片長度(實際大小len),容量(底層數組大小cap) 三個組成

基礎知識
  • []中有數字就是數組,沒有就是切片! (牢記)
    • []int{1,2,3}就是切片
  • 通常利用make()進行創建 如果使用{}就是直接書寫數組內容
  • []中不可以是變量比如 k ,后面這樣可以:[…] int {1,2,3,4} / [5] int {1,2,3,4,5}
  • make 初始化的時候如果只指定一個參數,那么就是切片長度=容量 這樣初始化 注意只要是初始化的,都會用 0 占位!!
  • 理解res := []int{} 或者 var res []int 或者 res := make([]int,0) 不同的創建方式,經常還是用 make 更加直觀
數組和切片的區別

array:數組 (不過變量命名無所謂) slice:切片
![[…/…/attachments/Pasted image 20250525104949.png]]
基本用的都是切片

append函數
通過append看切片和擴容
  • 不能直接使用索引來突破切片的長度限制
	func main() {a := make([]int, 5, 10) //長度a = append(a, 1, 2, 3,4)fmt.Printf("追加后切片長度為:%d,容量為:%d\n", len(a), cap(a))fmt.Println(a[0:5])fmt.Printf("追加后賦值的切片長度為:%d,容量為:%d\n", len(s1), cap(s1))fmt.Printf("追加后原來的切片長度為:%d,容量為:%d\n", len(a), cap(a))
}
//追加后切片長度為:9,容量為:10
//[0 0 0 0 0]
//追加后賦值的切片長度為:12,容量為:20 
//追加后原來的切片長度為:9,容量為:10
通過 append 合并切片
func main() {array := []int{1, 2, 3, 4, 5}array2 := []int{1, 2, 3, 4, 5}res := append(array,array2...) //需要加...fmt.Println(res)//[1 2 3 4 5 1 2 3 4 5]
}

算法中常用:

a := int(len(numbers)/2) //取出中間元素的位置
nunbers = append(numbers[:a],numbers[a+1:]...) //去掉這個個數
利用[:]的方式制造切片
截取示范
  • :后面的是不包括在里面的
    func main() {array := []int{1, 2, 3, 4, 5}s1 := array[:3]s2 := array[:]fmt.Println(s1, s2) // [1 2 3] [1 2 3 4 5]
    }
    
截取的地址分析
  • 二者地址上就差8個字節
func main() {array := []int{1, 2, 3, 4, 5}s1 := array[1:]fmt.Printf("array 切片地址%p\n",array) //不是 array 這個變量的地址,做好區分fmt.Printf("s1 切片地址%p\n",s1)fmt.Printf("array 變量地址%p\n",&array) //和上面切片地址是不一樣的
}
:= 賦值的影響

賦值的操作本質上就是參數拷貝
利用:=來共享底層數組的切片,修改時會同時影響到

func main() {array := []int{1, 2, 3, 4, 5}s1 := arrays2 := array[1:3]array[0] = 100fmt.Println(s1)fmt.Println(s2)//[100 2 3 4 5]//[2 3]
}
range 的使用
func main() {nums := []int{2, 3, 4}sum := 0for _, num := range nums {sum += num}fmt.Println("sum:", sum)for i, num := range nums {if num == 3 {fmt.Println("index:", i)}//index: 1 }kvs := map[string]string{"a": "apple", "b": "banana"}for k, v := range kvs {fmt.Printf("%s -> %s\n", k, v)}//兩個變量的時候傳遞的是key - valuefor k := range kvs {fmt.Println("key:", k)}//只有一個的時候,傳遞的是 keyfor i, c := range "go" {fmt.Println(i, c)}//0 103// 1 111   本質因為字符串之中是 int32 存儲的}#### slice 相關庫
######  slices.Equal(a,b)  return bool  判斷是否相等
```Go
func main() {array := []int{1, 2, 3, 4, 5}s1 := arrayres:=slices.Equal(s1, array)fmt.Println(res) // Output: true
}

比較的時候不會看切片的 cap 是不是一樣的,就是看 len 中的

copy的使用

有多少就 copy 多少,(,)從后面的 copy 到前面的

func main() {array := []int{1, 2, 3, 4, 5}s1 := make([]int, 6)s2:= make([]int, len(array))s3 := make([]int, 3)fmt.Println(len(s1), cap(s1)) // Output: 6,6copy(s1, array)copy(s2, array)copy(s3, array)fmt.Println(s1) // Output: [1 2 3 4 5 0]fmt.Println(s2) // Output: [1 2 3 4 5]fmt.Println(s3) // Output: [1 2 3]res := slices.Equal(s1, array)res2 := slices.Equal(s2, array)fmt.Println(res) // Output: falsefmt.Println(res2) // Output: true
}

Map映射

類似于 python 的字典

  • key和value 鍵-值的對應
    • var mapname map[keytype] valuetype 定義
基本示例
func main() {m := make(map[string]int)//map will auto increasem["k1"] = 7m["k2"] = 13fmt.Println("map:", m)v1 := m["k1"]fmt.Println("v1:", v1)v3 := m["k3"]fmt.Println("v3:", v3)fmt.Println("len:", len(m))delete(m, "k2")fmt.Println("map:", m)//delete certain keyclear(m)fmt.Println("map:", m)//clear all of the map_, prs := m["k2"]fmt.Println("prs:", prs)//return the value and indication about the key's existence//to disambiguate between missing keys and keys with zero values like 0 n := map[string]int{"foo": 1, "bar": 2}fmt.Println("map:", n)n2 := map[string]int{"foo": 1, "bar": 2}if maps.Equal(n, n2) {fmt.Println("n == n2")}
} 
map在并發讀寫中的問題
aa := make(map[int]int)go func (	for {// aa[0] = 5  //不可以的,不支持并發寫_ = aa[2]   //可以的,讀操作不影響寫操作})()go func ()  {for {_ = aa[1]}}()
Map原理
map 結構

指定map長度為N,會初始化生成桶,桶數量為log2N
map在超過負載因子的時候會雙倍重建,如果溢桶太大就會等量重建。當用到的時候舊桶才會放入新桶

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

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

相關文章

C# AI(Trae工具+claude3.5-sonnet) 寫前后端

這是一個AI 寫的前后端分離項目,通過AI編程&#xff0c;開發電商管理系統&#xff08;登陸、注冊&#xff09; 使用的AI工具為 Trae工具(字節國際版)claude3.5-sonnet(目前代碼最強模型) 前端為 vue3Bootstrap 后端為 C# net5.0(因為我電腦里面已經安裝了這個新版更好) do…

10G/25G PCS only mode for CoaXPress Over Fiber

背景 在CoaXPress Over Fiber的需求中, 需要利用XGMII的PCS 實現25G 數據速率的穩定傳輸&#xff0c;也就是不需要其MAC層&#xff0c;只保留PMA PCS層&#xff0c;借用其物理端口 線纜&#xff0c;實現其它協議的數據傳輸。 25G PCS 25GMII 的 TX/RX 時鐘頻率在 DDR&#xff…

掌握聚合函數:COUNT,MAX,MIN,SUM,AVG,GROUP BY和HAVING子句的用法,Where和HAVING的區別

對于Java后端開發來說&#xff0c;必須要掌握常用的聚合函數&#xff1a;COUNT&#xff0c;MAX&#xff0c;MIN&#xff0c;SUM&#xff0c;AVG&#xff0c;掌握GROUP BY和HAVING子句的用法&#xff0c;掌握Where和HAVING的區別&#xff1a; ? 一、常用聚合函數&#xff08;聚…

無人機飛行間隔安全智能評估、安全風險評估

無人機空中安全飛行評估需結合改進碰撞模型、蒙特卡洛仿真、安全間隔反推及動態避障策略&#xff0c;通過多機型分類與實時數據融合&#xff0c;實現從理論建模到實際部署的全流程管控&#xff0c;為城市低空密集飛行提供安全保障。 需求 無人機飛行間隔安全智能評估 無人機…

pdf圖片導出(Visio和Origin)

一、Visio 導入pdf格式圖片 1. 設計->大小&#xff0c;適應繪圖。 2. 文件->導出&#xff0c;導出為pdf格式。 上面兩部即可得到只包含圖的部分的pdf格式。 如果出現的有默認白邊&#xff0c;可以通過以下方式設置&#xff1a; 1. 文件->選項->自定義功能區->…

實現一個帶有授權碼和使用時間限制的Spring Boot項目

生成和驗證授權碼記錄授權時間和過期時間實現授權邏輯 以下是具體的實現方法&#xff1a; 1. 生成和驗證授權碼 可以使用加密技術生成和驗證授權碼。授權碼中可以包含有效期等信息&#xff0c;并使用密鑰進行簽名。 示例代碼&#xff1a; java復制代碼 import javax.crypt…

官方SDK停更后的選擇:開源維護的Bugly Unity SDK

騰訊Bugly&#xff0c;為移動開發者提供專業的異常上報和運營統計&#xff0c;幫助開發者快速發現并解決異常&#xff0c;同時掌握產品運營動態&#xff0c;及時跟進用戶反饋。 但是&#xff0c;免費版的Unity SDK已經很久不更新了&#xff0c;會有一些問題和特性缺失&#xff…

Spring Boot分頁查詢進階:整合Spring Data REST實現高效數據導航

目錄&#xff1a; 引言分頁查詢基礎回顧 2.1 Spring Data JPA分頁接口 2.2 Pageable與Page的使用 2.3 常見分頁參數設計Spring Data REST簡介 3.1 HATEOAS與超媒體驅動API 3.2 Spring Data REST核心功能 3.3 自動暴露Repository接口整合Spring Boot與Spring Data REST 4.1 項目…

[Datagear] [SQL]實現分組統計同時帶匯總行的兩種方式對比分析

在進行數據可視化開發時,我們經常會遇到用戶提出的需求:除了展示按某字段分組統計的數據外,還希望看到一個“整體總計”的數據行。這種匯總行在報表、圖表展示中極為常見,可以幫助用戶快速理解全局數據水平。 實現這一功能的方法主要有兩種:一種是使用 SQL 的 GROUP BY ..…

Docker常用命令介紹

Docker常用命令 1、本地鏡像管理 save 命令 將一個或多個 Docker 鏡像保存到一個 tar 歸檔文件中&#xff0c;以便在其他環境中分發或備份。 # 語法&#xff1a;docker save [OPTIONS] IMAGE [IMAGE...]# 保存單個鏡像到文件 docker save -o myimage.tar myimage:latest# 保…

09 接口自動化-用例管理框架pytest之allure報告定制以及數據驅動

文章目錄 一、企業級的Allure報告的定制左邊的定制&#xff1a;右邊的定制&#xff1a;1.用例的嚴重程度/優先級2.用例描述3.測試用例連接的定制4.測試用例步驟的定制5.附件的定制 二、企業中真實的定制有哪些&#xff1f;三、allure報告如何在本地訪問四、allure中的數據驅動裝…

DDoS防護實戰——從基礎配置到高防IP部署

一、基礎防護&#xff1a;服務器與網絡層加固 Linux內核優化&#xff1a; 調整TCP協議棧參數&#xff0c;緩解SYN Flood攻擊&#xff1a; # 啟用SYN Cookie并減少超時時間 echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout…

華為云Flexus+DeepSeek征文|Flexus云服務器Dify-LLM資源部署極致體驗Agent

前引&#xff1a;重磅來襲&#xff01;本次以DeepSeek-V3/R1商用大模型和Dify-LLM應用平臺一鍵部署為核心&#xff0c;專為新手打造“開箱即用”的AI開發體驗。無論你是想快速搭建企業級AI應用&#xff0c;還是探索大模型落地的無限可能&#xff0c;只需跟隨小編實現三步走&…

SQLAlchemy 2.0 查詢使用指南

SQLAlchemy 2.0 查詢使用指南 1. 環境設置 首先&#xff0c;需要安裝 SQLAlchemy 2.0 版本。假設你使用的是 SQLite 數據庫&#xff0c;可以通過以下命令安裝 SQLAlchemy&#xff1a; pip install sqlalchemy接著&#xff0c;我們創建數據庫連接并初始化會話&#xff1a; f…

Windows 使用 WSL 安裝 Ubuntu

一&#xff0c;前言 Windows 上輕松跑 Linux 又不想用笨重的VMware 和VirtualBox &#xff0c;怎么辦&#xff1f; 開源項目 Windows Subsystem for Linux (WSL)。它解決了許多開發者在 Windows 和 Linux 間切換的痛點&#xff0c;實現在 Windows 上無縫跑 Linux 工具和命令。…

[Excel VBA]如何製作買三送一優惠條件的POS結帳介面?

Excel I VBA I 買三送一優惠條件的POS結帳機 因應商品特賣活動&#xff0c;結帳介面需整合特定優惠條件&#xff0c;如買三送一&#xff0c;買五送二等等優惠條件。本文封面影片以買三送一為範例&#xff0c;並搭配VBA和對應按鈕&#xff0c;而實現銷售訂單紀錄和即時更新庫存等…

3d世界坐標系轉屏幕坐標系

世界坐標 ——> NDC標準設備坐標 ——> 屏幕坐標 標準設備NDC坐標系 屏幕坐標系 .project方法將 將向量(坐標)從世界空間投影到相機的標準化設備坐標 (NDC) 空間。 手動實現HTML元素定位到模型位置&#xff0c;實現模型標簽效果&#xff08;和css2Render原理同理&#…

Idea出現 100% classes 等

總是誤點出來&#xff0c;每次又忘了怎么消除&#xff0c;在這里記錄一下。 出現這樣&#xff1a; 操作idea界面的&#xff1a;點擊View->Tool Windows ->Coverage&#xff0c;然后關掉

從零開始學習QT——第一步

一、Qt 1.1、Qt是什么 Qt是一個跨平臺的C圖形用戶界面應用程序框架。它為應用程序開發者提供建立圖形界面所需的所有功能。它是完全面向對象的&#xff0c;很容易擴展&#xff0c;并且允許真正的組件編程。 1.2、Qt的發展歷程 1991年 Qt最早由芬蘭奇趣科技開發 1996年 進入商業…

MySQL 8.0 OCP 1Z0-908 171-180題

Q171.Examine this MySQL client command to connect to a remote database: mysql-h remote-example.org-u root–protocolTCP–ssl-mode Which two–ss1-mode values will ensure that an X.509-compliant certificate will be used to establish the SSL/TLS connection to …