發表文章

目前顯示的是有「Golang」標籤的文章

Slice沒照預期的切片

圖片
markdown ## 結論 在使用make初始化slice的時候,要考慮初始的長度,若是只用兩個參數會使長度等於容量,也就是已經初始化過了,這時再用append的話就不會如想像那樣從頭開始新增資料了! ## 環境 go v1.19.6 ```go type Card struct { Word string Explain string } ``` ## 預期的對照組 * 這是正常運行的 ```go stackB := []Card{ { Word: "test", Explain: "test", }, { Word: "test2", Explain: "test2", }, { Word: "test3", Explain: "test3", }, } fmt.Println(stackB) // worked stackB = stackB[:2] fmt.Println(stackB) // worked ``` ## 非預期的狀況 ```go stack, _ := GetCardMap() fmt.Println(stack) // worked stack = stack[:2] fmt.Println(stack) // only 2 empty element func GetCardMap() (m []Card, err error) { file, err := os.Open("frequecydic.txt") if err != nil { return nil, err } defer file.Close() totalCount, err := VerifyDic(file) if err != nil { return nil, err } // move file pointer to the beginning of file _, err = file.Seek(0, io.SeekStart) if err != nil { return nil, err...

gojmapr 我的第一個開源項目

圖片
gojmapr 在README中放入blog連結 Hi 各位,我做了一個Golang開源項目! → gojmapr 介紹 GO JSON MAPPER 簡稱 gojmapr 。 這是一個可以從一坨JSON中只取一些值並Map到的套件。 你有遇到第三方傳來的JSON很復雜,但是你只需要其中幾個屬性而不得不宣告一個超大還層層嵌套的結構嗎? 你在讀取外部JSON的資料時必需要 account.user.cart.order... ? 這就是你要找的套件了!:) 套件的誕生 起初我是在寫後端API,我在接從前端來的呼叫時發現我花了很長的時間寫好對應的struct,每次使用時候還必需寫超級長,就產生了 為什麼不能用簡單的struct直接讀取我要的值就好了 ,這樣不僅不用寫一大堆struct嵌套,也不怕之後維護的人把整個struct傳來傳去很難維護。 用法 先來一個復雜的JSON結構 jsonString :=`{ "cart" : { "items" : [ { "product" : { "id" : "123" , "name" : "Product A" , "description" : "Product A description" , "price" : 10.99 }, "quantity" : 2 }, { "product" : { "id" : "456...

怎麼樣做一個可以被Import的Go包

圖片
在這裡我將嘗試怎麼做一個最小的Go,放在github給別人引用 結論&要點 go.mod 中 module 應該為你的github路徑,這樣可以避免引用名稱不同的問題 小版本更新使用 tag 來上傳,破壞性更新再modle 最後方加上/v2, v3等字樣 檔名不要使用main.go 其餘應該都可以 package會是別人取用工具包的名稱 已完成的github包 github.com/limiu82214/GoHellowWorldForImport 過程 初始化 go mod init GoHellowWorldForImport 並上傳至github 寫main.go,並在另一個地方使用 go get ... 看到錯誤訊息 import "github.com/limiu82214/GoHellowWorldForImport" is a program, not an importable package (compile) ,因此猜測不能用main.go 更名為 GoHellowWorldForImport 在試一次 (包含package與函式) 由於快取的關係,新增tag代表新的版本號並上傳再試一次 拿到錯誤訊息,推測module名必須是 github.com/limiu82214/GoHellowWorldForImport 以符合import格式 go : github.com/limiu82214/GoHellowWorldForImport @v0 . 0.2 : parsing go. mod : module declares its path as : GoHellowWorldForImport but was required as : github.com/limiu82215/GoHellowWorldForImport" 測試成功,更改參數並記錄要點

FangChannel的GoLang學習筆記

圖片
繼[[深入淺出 Gp - O'REILLY]]之後依照 FangChannelGolang學習記 來復習 ,會再次記錄我認為需要記下的地方。 ![[Pasted image 20220904185635.png]] Q:為什麼 import要使用 "gonote/note" 而不是 "note" 才能使用到note.go的內容? A:因為go.mod裡面寫著 moudle gonote 意思是這整個模組是gonote Go大項目標準架構 api: API相關 assets: 圖片等資源 build: 建置好的文件 cmd: 子項目 configs: 配置文件 pkg: 存放編譯過的套件程式碼 慣例 // 單行註釋 -> 一般用來描述函數的目的與結構 一般多行註釋也建議使用 // ... // 用 [...] 自動讓GO判斷陣列長度 var a = [...] int { 1 , 2 , 3 , } range // 簡易歷遍陣列的方式 for index, value := range a { } // 若是不想要其中一個值可以用_代替 for _, value := range a { } 切片 // 切片是對陣列的引用,所以會改變陣列的值 arr := [ 5 ] int { 1 , 2 , 3 , 4 , 5 } // 這是一個[1,2,3,4,5]的陣列 x := arr[ 1 : 4 ] // 這是一個[2,3,4]的切片(Slices) (引用自arr) x[ 0 ] = 0 // 改片切片第0個值 fmt.Println( "arr=" , arr) // arr= [1 0 3 4 5] fmt.Println( "x=" , x) // arr= [0 3 4] // PS 切片也可以引用自切片,但最終都會指向原始的陣列 // PS 切片不引用的話,初值是nil fmt.Printf( "len(x)=%v" , len (x)) // 3 fmt.Printf( "cap(x)=%v\...

深入淺出 Gp - O'REILLY 心得

圖片
繼Introducing Go - O'REILLY之後的第二本Go的學習書藉,會再次記錄我認為需要記下的地方。 Package package main :特殊的套件,使用這個套件的目地通常代表程式碼需要被直接執行。 import "reflect" -> 其中有TypeOf可以用。 指令 gofmt file :gofmt可以自動排版Golang的程式碼。 go build :編譯成執行檔 go run :編譯加執行 go fmt :格式化程式碼成為Go標準格式 go version :顯示Go版本 規則 大寫起頭=> public 小寫起頭=> private 習慣 三段落的程式排列方式 (像Python) 套件子句 任何 import 陳述句 主要的程式碼 自訂套件註解必須是以Package開頭 自訂套件函式的註解必須以函數名開頭 套件名稱應該都是小寫,理想上只有一個單字組成 變數名稱小寫駝峰 定義型別的方法時接收器參數通常以型別的第一個小寫英文字來命名 ex: func (m MyType) sayHi() {...} 因為型別是MyType所以參數是m 在為type struct設計getter與setter的時候有個命名慣例,假如參數是year,那寫入值會是SetYear,讀取值會是Year (省略Get) 用法 型態轉換 float64(var) => 把變數轉成float64這個型態 套件 log 日誌 log.Fatal(...) => 在console報錯並印出... strconv 轉換字串類型 strings 字串處理 os 讀寫系統資料 file , err := os. Open ( "filePath" ) //讀文件 scanner := bufio.NewScanner( file ) // 建立Buff暫存 for scanner.Scan() { // 讀一行 ... } err = file . Close () // 關閉檔案釋放資源 nte/http response, err := http. Get ( "url" ) // Get請求, response是含有Body結構,表示內容 ...

Introducing Go - 筆記

圖片
簡述 這本書是一本入門的書,在這裡我會寫下屬於我自已的筆記,希望對你也有用。 (PS: 我是一個己經會寫程式的人,英文普通) 紀錄: 基本語法 其他語言不同之處 閱讀時會碰觸到的英文 觀念 Go 是一種強型別的語言。 一般來說盡量使用 x := 5 這種方式進行宣告 通常變數命名的風格用 小寫駝峰 在Go中,參數傳遞的方式總是以copied(傳值)的方式 全域變數只能用 var name type 的型式宣告,無法使用 x := 5 的方式 Nan -> Not a Number (i.g. 0/0, +∞, -∞) 指令 查功能 go doc [package] [function] ->如果拿到 "go doc command not found" 嚐試這個指令安裝說明文件 -> go get golang.org/x/tools/cmd/godoc 語法 Go不支援三元運算子 ?: 字串除了 "text" 的形式,也可以是 `text` 用 + 來連結字串 用 _ 來接收用不到的回傳值 variable var a = 5 a := 5 var ( a = 5 b = 10 c = 15 ) for // 1.只有條件 for 條件 { ... } // 2.含設初值與迭代 for 設初值 ; 條件 ; 迭代 { ... } // 3. 無窮迴圈 for 設初值 ; 條件 ; 迭代 { ... } if if 條件 { ... } if 條件 { ... } else if 條件 { ... } if 條件 { ... } else { ... } if 賦初值 ; 條件 { ... } switch var { case val : ... case val : ... case val : ... case val : ... case val : ... case val : ... default : ... } array 陣列最後一個元素要有 ,...