發表文章

目前顯示的是 2022的文章

Docker 筆記 連環境也一起打包工具

圖片
將環境打包成image並直接運行,由於打包的關係,所以互不影響 image是打包好的映象檔 container是映像檔被執行後產稱的一堆檔案 基本套路: 寫好Dockerfile然後build,他就會照你的Dockerfile建立出image檔 docker run 執行 from imageI docker exec 執行 from container docker logs <container ID> 查log --rm 當container變成Exited時,自動移除container -d 背景執行 docker rm -f 強制移除container,可省略stop -p port映射 -e key=value 設定到環境變數 $pwd 神奇變數: 當下的目錄 -w 進入container後預設在哪個目錄下執行指令 volume 倉庫 原本container玩自己的,但是你指定他的一些玩具只能在倉庫(volume)中玩,於是你就可以透過存取倉庫,在container以外的地方備份或存取資料了 參考 -v [/host]:[/container][param] 將volume掛載到container上(將/host目錄 Mapping到 /container目錄),param可以設定讀寫權限 --volumes-from [container] 直接使用某個container現在的volume Network 網路 讓很多container加入倒network裡面,就可以利用container name來互相呼叫與使用 (像是-link) $docker netowrk create my-net 建立network $docker run --network my-net 加入倒my-net的network Dockerfile $docker build . 拆解Dockerfile並一一執行 -t=[image]:[version] 指定tag,使用的image與產出image的版本號 --no-cache 不快取 檔案 .dockerignore 像是.gitignore,用來避開在build的時候不要的檔案 FROM

怎麼樣做一個可以被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結構,表示內容