Alan's BLOG
  • archives
  • posts
  • tags
  • about
  • quote
  • search
Home

Posts

淺談 Go 語言中的 Map - 快速查詢與狀態儲存的利器

👨‍💻簡介 在 Go 語言中,有著一個強大又便捷的工具,可以讓你以鍵-值(Key-Value)的形式儲存和查詢資料,它就是「Map」。Map 在 Go 語言中扮演了重要的角色,簡化了許多資料處理的任務,現在讓我們一起來深入了解這個有趣的資料型別。 Map的基本概念 Map 是 Go 語言中的一種內建資料型別,用來存儲鍵值對。簡單來說,你可以將 Map 想像成一個無序的集合,每個元素都有一個唯一的鍵和相應的值。這讓你可以根據鍵來快速查詢和存取對應的值,就像是字典一樣。 宣告和初始化 Map 在 Go 中,宣告 Map 可使用以下語法: m1 := make(map[string]int) // 創建一個儲存字串為鍵,整數為值的 Map m2 := map[int]string{1: "A", 2: "B"} // 創建一個包含鍵值對的映射 var m3 map[string]int // 創建一個鍵為字串、值為整數的空映射 而宣告時順便初始化可以使用以下方式: myMap := map[string]int{ "apple": 3, "banana": 5, } var myMap map[string]int myMap = map[string]int{ "apple": 3, "banana": 5, } Map的基本操作 Map 的操作非常簡單直觀。你可以使用鍵來存取對應的值,也可以使用鍵來新增、修改或刪除元素。 新增或修改元素 myMap["apple"] = 3 // 新增一個元素,鍵是 "apple",值是 3 myMap["banana"] = 5 // 新增一個元素,鍵是 "banana",值是 5 myMap["apple"] = 10 // 修改鍵為 "apple" 的元素的值為 10 查詢元素 value := myMap["banana"] // 根據鍵 "banana" 查詢對應的值 刪除元素 delete(myMap, "apple") // 刪除鍵為 "apple" 的元素 遍歷 Map 要遍歷一個 Map 中的所有元素,通常會使用 for range 迴圈:...

2023-08-28 · 2 min · 319 words · Alan

Go 語言中的動態陣列:深入解析切片

👨‍💻簡介 在 Go 語言中,切片(Slice)是一種動態序列的資料結構,能夠方便地存儲和操作多個相同類型的元素。切片相比於陣列,更具有彈性,因為它的大小是可變的,可以根據需要動態增長或縮小。切片在處理集合型資料時非常實用,讓你能夠輕鬆地新增、刪除、修改和操作元素,同時避免了固定大小的限制。 切片的基本概念 切片是由一個指向陣列的指針、切片長度和切片容量組成的。切片的長度指的是切片中實際包含的元素個數,而切片的容量則是從切片開始的底層陣列中能夠訪問的元素個數。切片的容量可以大於或等於切片的長度。 宣告和初始化切片 在 Go 中,宣告和初始化切片可以使用以下的語法: var slice1 []int // 創建一個整數切片,大小和容量都是 0 slice2 := []string{"A", "B", "C"} // 創建一個包含三個字串元素的切片 slice3 := make([]int, 5) // 創建一個整數切片,大小為 5,容量也為 5 slice4 := make([]int, 3, 5) // 創建一個整數切片,大小為 3,容量為 5 切片的基本操作 新增元素到切片 Go語言中有個內件函式append(),可以用來新增元素到切片中,這使得切片能夠根據需求動態增長。 numbers := []int{10, 20, 30} numbers = append(numbers, 40, 50) // 新增兩個元素到切片 需要注意的是,如果切片的容量不足以容納新增的元素,append() 函式會創建一個新的切片,並將舊的元素和新的元素一同複製到新的切片中。 查詢和修改切片元素 切片的元素可以通過索引來存取,索引從 0 開始計數。 numbers := []int{10, 20, 30, 40, 50} firstNumber := numbers[0] // 存取第一個元素,值為 10 secondNumber := numbers[1] // 存取第二個元素,值為 20 numbers[2] = 35 // 修改切片中的元素,將第三個元素改為 35 切割和遍歷切片 可以使用切片的切割操作來獲取部分切片,這可以通過指定切片的起始索引和結束索引來實現:...

2023-08-24 · 2 min · 392 words · Alan

陣列:Go語言中的數據小倉庫

👨‍💻簡介 陣列就像是一個儲存相同類型資料的容器,你可以想像成裝滿了一樣東西的盒子,每個東西都叫做陣列元素。這種類型可以是基本的,像是整數或字串,也可以是你自己定義的型別。不過陣列有個限制,就是大小一旦確定就無法改變。在Go語言裡,陣列的長度也是型別的一部分。舉例來說,[5]int和[10]int就是不同的型別。雖然它們都是整數陣列,但因為長度不同,所以視為不同的資料型別,不能直接互相給值或操作。這麼做是為了在長度上更加嚴謹,不會混淆不同大小的陣列,增加了資料的安全性。 另一個類似的東西是切片(Slice),這東西可以想像成動態的序列,可以根據需要自由地增加或減少。不過,為了更好地理解切片,我們先學學陣列的使用。 陣列的基本概念 陣列是由一組元素所組成的固定大小的資料結構,每個元素都有一個相應的索引。陣列的大小在宣告時就需要確定,並且在後續操作中無法改變。 宣告和初始化陣列 在 Go 中,宣告和初始化陣列可以使用以下的語法: var arr1 [3]int // 創建一個整數陣列,大小為 3 arr2 := [4]string{"A", "B"} // 創建一個包含 4 個字串元素的陣列 arr3 := [...]int{1, 2, 3} // 自動推斷陣列大小為 3 你也可以在宣告陣列的同時,使用指定索引的方式來初始化陣列: arr := [...]int{1: 10, 3: 30} // 陣列的值為 [0 10 0 30] 陣列的基本操作 取得陣列元素 陣列的元素可以通過索引來存取,索引從 0 開始計數。 numbers := [5]int{10, 20, 30, 40, 50} firstNumber := numbers[0] // 存取第一個元素,值為 10 secondNumber := numbers[1] // 存取第二個元素,值為 20 假設我們有一個陣列 arr := [5]int{1, 2, 3, 4, 5}。...

2023-08-24 · 3 min · 427 words · Alan

探索 Go 語言的流程控制

👨‍💻簡介 本文簡單介紹了 Go 語言的流程控制概念,涵蓋了從條件語句到迴圈,再到 range 遍歷數據結構,以及 goto 與標籤 label 的應用。主要知識點為如何使用 if 語句進行條件判斷,以及在不同情況下運用 switch 語句。此外,還探討了 for 迴圈和 range 的運用,以及在特定情境下使用 goto 與 label。 條件語句 在 Go 語言中,我們可以使用條件語句來根據不同的條件執行不同的程式碼塊。常見的條件語句包括: if 語句 if 語句用來檢查一個條件是否成立,如果條件為真,就執行相關的程式碼塊。例如: age := 18 if age >= 18 { fmt.Println("你已成年") } else { fmt.Println("你還未成年") } 我們也可以使用 else if 分支處理多種情況: age := 25 if age < 18 { fmt.Println("你還未成年") } else if age >= 18 && age < 60 { fmt.Println("你已成年,但尚未退休") } else { fmt....

2023-08-21 · 2 min · 372 words · Alan

Go 語言的各種運算符

👨‍💻簡介 本文快速介紹了 Go 語言中的各種運算符,從數學計算到邏輯判斷,包括自增自減、賦值、比較和位運算。透過實例和清晰的解釋,快速掌握如何在程式中運用這些運算符。 算術運算符 在 Go 語言中,我們可以使用各種算術運算符來執行基本的數學運算。以下是一些常用的算術運算符: +:加法運算,用來將兩個數相加。 -:減法運算,用來從一個數中減去另一個數。 *:乘法運算,用來將兩個數相乘。 /:除法運算,用來將一個數除以另一個數。 %:求餘運算,用來得到兩個數相除的餘數。 例如: a := 5 b := 3 c := a + b // c 的值是 8 d := a * b // d 的值是 15 此外,我們還有自增和自減運算符,它們用來讓變數的值增加或減少 1: ++:自增運算符,將變數的值增加 1。 --:自減運算符,將變數的值減少 1。 舉個例子: x := 10 x++ // x 的值變成了 11 y := 5 y-- // y 的值變成了 4 賦值運算符 賦值運算符用來將一個值賦給一個變數。我們常見的賦值運算符有: =:將右邊的值賦給左邊的變數。 +=:先將右邊的值加到左邊的變數上,然後再將結果賦給左邊的變數。 -=:先從左邊的變數中減去右邊的值,然後再將結果賦給左邊的變數。 *=:先將左邊的變數乘以右邊的值,然後再將結果賦給左邊的變數。 /=:先將左邊的變數除以右邊的值,然後再將結果賦給左邊的變數。 %=:先將左邊的變數除以右邊的值取餘數,然後再將結果賦給左邊的變數。 簡單範例如下:...

2023-08-21 · 2 min · 401 words · Alan

Kubernetes Secret

甚麼是secret 在 Kubernetes 裡,Secret 就像是一個保險箱,可以放你任何不想公開的東西。比如說密碼、API 金鑰、憑證等,這樣的資料可能會被放在 Pod 裡,但你可以用 Secret 來避免直接在應用程式的程式碼中暴露這些機密資料。 可以說 Secret 就像是 ConfigMap 的一個好朋友,但更專門用來保護機密資料的地方。 為甚麼需要secret 最主要的用意是保護你的敏感資訊,不讓它們在 Pod 或容器中以明文流傳。這樣可以讓我們的應用程式變得更安全,減少機密資訊外洩的風險。還能讓你的秘密資料在不同 Pod 之間分享,並且保有安全性。 何時使用secret 保存必要應用程式的憑證,如 TLS 證書,以確保安全通信。 儲存應用程式所需的金鑰,包括外部服務的 API 金鑰,確保安全連接。 保管敏感的環境變數,如資料庫密碼等機密驗證資訊,維護應用程式安全性。 安全儲存驗證資訊,如 OAuth 令牌,用於與其他應用程式進行安全交互。 維持隱私的配置設定,如設定文件、金鑰路徑等,確保敏感資訊不外洩。 secret的類型有哪些 內建類型 用途 Opaque 使用者定義的任意資料 kubernetes.io/service-account-token 服務帳戶令牌 kubernetes.io/dockercfg ~/.dockercfg 檔案的序列化形式 kubernetes.io/dockerconfigjson ~/.docker/config.json 檔案的序列化形式 kubernetes.io/basic-auth 用於基本身份驗證的憑證 kubernetes.io/ssh-auth 用於 SSH 身份驗證的憑證 kubernetes.io/tls 用於 TLS 客戶端或伺服器端的資料 bootstrap.kubernetes.io/token 啟動引導令牌資料 如何撰寫使用secret 建立secret 聲明式 apiVersion: v1 kind: Secret metadata: name: my-secret data: username: YWRtaW4= # Base64 編碼的 "admin" password: c2VjcmV0cGFzc3dvcmQ= # Base64 編碼的 "secretpassword" 宣告式 從命令行傳遞資訊建立secret kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secretpassword 從檔案建立secret kubectl create secret generic my-secret --from-file=path/to/username....

2023-08-17 · 2 min · 265 words · Alan

Golang 的資料型別一覽

👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。 你甚至可以使用 int 關鍵字,它會依據不同作業系統自動選擇大小: 在 32 位作業系統:int 會變成 int32 在 64 位作業系統:int 會變成 int64 但是,別忘了,數字型別還有其範圍和特點。 型別 位元組數 最小值 最大值 次方範圍 int8 1 -128 127 -2^7 至 2^7-1 int16 2 -32,768 32,767 -2^15 至 2^15-1 int32 4 -2,147,483,648 2,147,483,647 -2^31 至 2^31-1 int64 8 -9,223,372,036,854,775,808 9,223,372,036,854,775,807 -2^63 至 2^63-1 uint8 1 0 255 0 至 2^8-1 uint16 2 0 65,535 0 至 2^16-1 uint32 4 0 4,294,967,295 0 至 2^32-1 uint64 8 0 18,446,744,073,709,551,615 0 至 2^64-1 可以通過 unsafe....

2023-08-17 · 3 min · 528 words · Alan

淺談 Golang 變數與常數:宣告、初始化與使用

👨‍💻簡介 在 Golang 中,你可以使用不同的方式來宣告變數和常數。宣告變數時,可以直接指定值,或者使用型別推導,更簡單地用 := 來宣告局部變數。另外,還可以一次宣告多個變數,相同型別的變數可以一起宣告,或者使用括號宣告不同型別的變數。常數則使用 const 關鍵字宣告,確保值不變,有助於提高程式碼的可讀性和穩定性。 變數的聲明 在 Golang 裡,變數是程式中保存資料的容器。變數名稱由字母、數字、底線組成,但首個字符不能是數字。Golang 的關鍵字和保留字都不能用作變數名稱。 變數的宣告和初始化方式多種多樣,在使用變數之前,需要先聲明變數。在同一範圍內,不允許重複聲明相同的變數。而且,一旦聲明變數,就必須在之後的程式碼中使用它。 如果變數在聲明後沒有進行初始化,則打印出來的值將是空的。 如何定義變數 單變數宣告 普通聲明(variable declaration) 使用 var 關鍵字進行普通聲明,然後指定變數名稱和類型,再賦予初始值。 var name string name = "Alan" 帶初始化的聲明(direct define): 可以直接指定變數的類型和初始值。 var age int = 25 也可以省略類型,讓變數類型根據初始值自動推斷。 var age = 25 簡短變數聲明(short declaration) 在函式內部,可以使用簡化的 := 語法同時宣告並初始化變數。 注意:簡短變數聲明只能用於局部變數,不能用於全局變數的聲明。 foo := "hello" bar := 100 多變數宣告 普通聲明 您可以同時宣告多個相同類型的變數。 var a, b int a = 10 b = 20 帶初始化的聲明(direct define): 可以直接指定多個變數的類型和初始值。 var x, y int = 5, 8 也可以省略類型,讓變數類型根據初始值自動推斷。...

2023-08-16 · 2 min · 270 words · Alan

🚀入門 Go 語言:關鍵概念、語法結構與實用技巧✨

👨‍💻簡介 在這篇文章裡,會簡單介紹幾個關鍵的基本概念和語法結構,加快上手這門程式語言。 文件組成 📦文件組成 一個典型的 Go 語言程式由以下幾個部分構成,讓我們逐一來看: Package 宣告 程式的一開始會有一個 package 宣告,用以指定目前的檔案隸屬於哪個程式套件(package)。 package main 匯入套件 我們可以透過 import 關鍵字引入所需的套件(packages)。這些套件提供各式功能,協助我們輕鬆進行開發。 import ( "fmt" ) 函式定義 在 Go 語言中,程式邏輯主要由函式(functions)所組成。以下是主要函式 main 的定義,它是每個 Go 程式的起點。 func main() { fmt.Println("Hello World!") } 📝語法要點 在編寫 Go 程式時,有幾個語法上的重要要點需要注意: 語句可以透過換行或分號(;)來分隔。 左大括號 { 不應該單獨出現在一行的開頭,應該與其他語句放在同一行。 🔍註解的用法 在程式碼中,註解可以為程式邏輯提供解釋和說明。Go 語言支援兩種註解格式: 單行註解: // 這是單行註解的範例 多行註解(C 風格): /* 這是多行註解的範例, 可以跨越多行並提供更多細節說明。 */ 📚參考資料 Go Syntax (w3schools.com)

2023-08-15 · 1 min · 60 words · Alan

如何在go中驗證SSL憑證

👨‍💻如何在go中驗證SSL憑證 因之前玩過監控證書,最近在接觸golang因此來看看有甚麼方法能夠取得憑證到期日,最後發現有crypto/tls這個module可以用,驗證步驟簡單三步如下 1. 確認網站是否有SSL證書 package main import ( "crypto/tls" ) func main() { conn, err := tls.Dial("tcp", "example.com:80", nil) if err != nil { panic("Server doesn't support SSL certificate err: " + err.Error()) } } 上述程式碼首先使用 tls.Dial 建立TLS連線,語法規則為 tls.Dial(protocol, website, tls config) 連線成功則返回一個tls.Conn 執行後會噴以下錯誤 panic: Server doesn't support SSL certificate err: tls: first record does not look like a TLS handshake goroutine 1 [running]: 接著將網站改為google重新執行一次程式碼,沒有任何輸出表示正常,也代表網站有啟用SSL package main import ( "crypto/tls" ) func main() { conn, err := tls....

2023-08-07 · 2 min · 235 words · Alan
« Prev  Next  »
© 2024 艾倫的程式之旅 Powered by Hugo & PaperMod