Showing posts with label Golang. Show all posts
Showing posts with label Golang. Show all posts

Tuesday, August 29, 2023

[Golang] 在VSCode中管理多個Go專案 Go 1.18+

在進行多個Go專案開發時,我們經常會遇到一些困擾,尤其是當我們嘗試在VSCode中同時打開一個包含多個Go專案的目錄時。這時候,你可能會遇到以下錯誤訊息:

錯誤

gopls requires a module at the root of your workspace.
You can work with multiple modules by opening each one as a workspace folder.
Improvements to this workflow will be coming soon (https://github.com/golang/go/issues/32394),
and you can learn more here: https://github.com/golang/go/issues/36899.

從Go 1.18版本開始,原生支持多模塊工作區,這是通過在父目錄中具有一個go.work文件來實現的。
假設我們有這樣的目錄結構:

/parent
├── proj1
│ ├── go.mod
│ ├── hello-world.go
└── proj2
├── go.mod ├── slices.go

我們可以通過執行以下命令來創建並填充go.work文件:

cd parent
go work init
go work use proj1
go work use proj
2

這將在您的父目錄中添加一個go.work文件,其中包含您標記為使用的目錄列表:

go 1.18

use (
    ./proj1
./proj2
)

通過這種方式,我們就能夠在VSCode中輕鬆地管理和切換不同的Go專案,而無需擔心模塊相關的問題。

Friday, May 27, 2022

[Golang] Golang with Cgo 動態連結(dynamic linking) 函式庫範例與筆記 in Linux environment

之前曾經動手實作並測試Golang with Cgo 動態連結(dynamic linking) 與 靜態連結(static linking)函式庫範例用在Windows環境,相關內容整理在這篇:

[Golang] Golang with Cgo 動態連結(dynamic linking) 與 靜態連結(static linking)函式庫範例與筆記 in Windows environment

最近看到一篇 "最简单的cgo示例",既簡單且完整的示範了Golang with Cgo 動態連結(dynamic linking) 函式庫範例在Linux環境,個人將其改寫並放到github上: 

Wednesday, May 25, 2022

[Golang] Golang應用程式使用TensorFlow/TensorFlow Lite(TFLite)/Tensorflow Serving 的方法整理

Golang應用程式使用TensorFlow 或是 Tensorflow Lite(TFLite) 的前提是必須要有Tensorflow C 函式庫 或是 TensorFlow Lite C 函式庫,一般來說,比較少情況會是用Golang應用程式使用TensorFlow透過TensorFlow C 函式庫,因為未經過最佳化而效能不佳。Golang應用程式使用TensorFlow Lite(TFLite) 透過TensorFlow Lite C 函式庫會是效能較好的其中一種方式。以下將整理相關資訊來說明:

Sunday, May 15, 2022

Tuesday, May 3, 2022

[Golang] 用 Golang 使用 Raw Socket v.s. libpcap 兩者優劣比較

前陣子花了一些時間在找一種方式,可以透過寫程式的方式抓取進出於任何device interfaces on Linux主機上的封包,目前主要是有這兩大作法: Raw Socket v.s. libpcap

Monday, May 2, 2022

[Golang] 檢查IP 是否在特定範圍內的簡單範例

檢查IP 是否在特定範圍內,的最快方法是什麼?例如,給定範圍192.168.1.1至192.168.10.254,如何檢查給定的輸入IP是否在該範圍內?以下是簡單範例:

Wednesday, April 20, 2022

[Golang] 一個簡單範例使用gopacket去解析LLDP封包內容

因為工作上需要查看主機上所收到任何的LLDP封包,故在網上搜尋了一下資料與範例程式碼,組成下列一個簡單範例。

本程式會找出所有在此本機上的Net Devices ( Interface ),並依序收集封包,一旦發現有LLDP則會列印相關資訊在console上。

Tuesday, March 22, 2022

[GraphQL] 使用Golang Gin Framework來建置GraphQL的API Server

 [前言]

本篇內容將提供快速的指引,使用Golang Gin Framework來建置GraphQL的API  Server。


[使用Golang Gin Framework來建置GraphQL的API  Server]

GraphQL API Server主體上來說是參考下列文章的方式來建置:

第 1 天 - API 服務器(Go,GraphQL) - 第 1 部分

第 2 天 - API 服務器(Go,GraphQL) - 第 2 部分

Golang Gin Server網路上已經有很多資源,我們假設已經有的前提下,如何來建置GraphQL的API  Server。首先,先安裝所需的模組:

#在個人自己的Gin Server 的 project 內
$ go get github.com/99designs/gqlgen
$ go get github.com/gin-gonic/gin

我們需要準備下列檔案: 

Friday, March 18, 2022

[Golang] Go 1.16 中關於go get和go install的變動

 

[前言]

其實Go 1.16已經 Release 很久了,但最近發現關於 go get 的行為跟以前不一樣並且多了 go install 這個 tool,所以本篇記錄一下需要注意的地方。

[關於go get和go install的變動]

我目前Golang的版本如下:

Sunday, February 6, 2022

[Golang] Pointer Performance 指標傳遞性能

Pointer Performance 

我在O`REILLY出的一本書 "Go學習手冊"內有看到一個很有趣的段落: 指標傳遞性能 ( Pointer Performance )

我把這段的重點直接整理下來(因為很重要) 如下:

  • 無論資料的大小為何,將指標傳入函式的時間都是固定的,大約是1 nanosecond。
  • 如果struct夠大,將struct的指標當成輸入參數或是回傳值可以改善性能
  • 回傳指標 vs. 回傳值的行為比較有意思。如果資料結構小於1MB,回傳指標型別其實比回傳值更慢。例如: 100-byte的資料結構大約要花10 nanosecond 來回傳,但是那個資料結構的指標大約要花30 nanosecond。當資料結構超過1MB,性能優勢就會逆轉,回傳10MB的資料大約要花2 millisecond,但是回傳它的指標大約是0.5millisecond再多一些。

Thursday, February 3, 2022

[用Golang寫小遊戲教學] 第八章 指標

 [前言]

指標語法在C/C++程式語言中是非常重要的用法與功能,它可以讓程式更快速且更高效。Golang保有了指標語法,之後的章節在寫小遊戲時也會用到,所以我們需要了解如何正確地使用它。

[指標快速入手]

透過變數宣告時,需要在型別前面加上 *號,代表是指標型態,用來告訴編譯器這變數是某種型別的指標變數

給值時也要給值的位置,我們在值前面加上 & 符號(位址運算子)。請看下面例子:

Friday, January 28, 2022

[用Golang寫小遊戲教學] 第九章 超簡化的碰撞檢測遊戲

[前言]



這是一個簡單的碰撞檢測遊戲,遊戲功能如下:
1、空格鍵發射紅色塊,紅色塊遇到左、右、上邊界反彈,遇到下邊界遊戲結束。
2、左右鍵移動白色塊接紅色塊,每接到一次加一分。
3、每5秒鐘隨機生成一個黃色塊,紅色塊觸碰到黃色塊時,黃色塊消失並加十分,黃色塊同時最多存在5個

但,這對於初學者來說還是太難理解其運作方式,我把這個小遊戲再精簡成超簡化的碰撞檢測遊戲,遊戲功能如下:
1、空格鍵發射紅色塊,紅色塊遇到左、右、上與下邊界反彈,遊戲不會自動結束。
2、左上角會顯示紅色塊目前的座標
3、在遊戲中按下空格鍵可以暫停,再按一次繼續。

[超簡化的碰撞檢測遊戲]

這邊會需要將Golang執行環境先準備好,請參考:

[用Golang寫小遊戲教學] 第七章 控制結構

[前言]

車輛需要依照交通規則、號誌與標誌來行駛,紅燈時停止、等待,綠燈直行或是轉彎,行駛速度也須遵守時速上限。在程式的世界中,執行程式的電腦也會遵守程式碼內所撰寫的控制結構來執行。在Golang的控制結構包含: If、Switch與For


注意: goto 這個控制結構我們先不研究歐!

[ If 陳述式]

Golang的if 陳述式用來控制程式執行符合條件的區塊,以下是 語法:

if condition1 {
// 如果 condition1 是true, 則此區塊會被執行
} else if condition2 {
        // 如果 condition2 是true, 則此區塊會被執行
} else {
       // 如果 condition1 與 condition2 都不是true, 則此區塊會被執行
}

If陳述式內的條件(condition),可以是產生 true / false 的運算式、變數的值等等。也可以利用 && (and) 或是 || (or) 去做交集或是聯集關係。

請看下列簡單的例子

Friday, January 14, 2022

[用Golang寫小遊戲教學] 第六章 結構 (Struct)

 

[前言]

我們在有些情況會希望把一些資料(有相關性)集結在一個結構內,舉例來說,一張身分證內包含了: 姓名、身份證字號、戶籍地、出生日期、配偶等等的資料,如果我們可以用一種型別可以包含上述這些資料,對於管理資料來說就會方便許多。如果大家有學過C語言的話,就會知道struct 這個複合資料型別。在Golang,就是把在C語言內的struct搬過來使用,並稱之為結構 (Struct)型別。而且,還可以賦予它擁有函數的做法,稱之為Receiver。

注意: 我們暫時不提interface,因為會太複雜ㄡ!


[定義結構(Struct)]

在Golang的定義結構 (Struct) 是使用 type 關鍵字基於 struct 來定義一個新的型別,語法用下列例子說明:

type IdentityCard struct {
myID string
myAge int
}

上述我們定義了一個新的struct型別,名稱是IdentityCard,裡面包含了兩個變數:myID與myAge。但,只是定義新的struct型別還不夠,我們需要宣告變數與初始化它才能使用。關於變數宣告可參考之前的文章: 

Thursday, January 13, 2022

[用Golang寫小遊戲教學] 第五章 函式(Function)

 

[前言]

函式(Function) 指的是將一或多段程式碼包裝起來,並且可以定義不給或是給定帶入的參數值,並可以重複使用。在程式開發中,是非常重要且經常使用的特性。因為它可以讓你的程式碼更方便維護與容易理解。

在之前的文章內有一些練習的連結,大家如果有注意到的話,每個練習都有一個func main() 的主程式函式定義,這也是Golang程式開始執行的進入點。

[函式(Function)之定義]

Golang 定義函式時,利用關鍵字func 放在前面,後面接著函式名稱,而需要輸入的參數型別宣告,則是放在名稱之後的小括號內。如果多個參數有同樣的型別,那麼只要最右邊同型別的名別右方加上型別就可以了。所需要回傳的變數前面須加上return關鍵字。

例如: 

Monday, December 27, 2021

[用Golang寫小遊戲教學] 第四章 陣列(Array)與切片(Slice)

[前言]

陣列(Array)就好比是單排座位的列車,座位編號從0開始,共有N個座位且不可增加座位數量。
切片(Slice)很像陣列(Array),但它是可以增加座位數量。 Slice細節還有關於容量與長度的問題,我們就先忽略它~
所以,這兩種資料結構可以存放一長串的資料,這是在寫小遊戲中非常常使用到的功能。


[陣列(Array)]

陣列(Array):它的長度是固定的(fixed length),使用語法: " [數量] 型別" 定義。例如: [100]int

它比較沒有彈性,內部存放的資料都必須要有相同的型別(像是整數、字串等等)。

已經學習過變數宣告,我們舉兩個例子(變數宣告與變數短宣告)來宣告變數型別為陣列:

Saturday, December 25, 2021

[用Golang寫小遊戲教學] 第一章 Golang開發環境設定

[前言]

工欲善其事,必先利其器。

Golang是個跨作業系統(像是: Windows、Linux、Mac OS等等)與支援多CPU架構(x86、ARM64等等)的程式語言,換句話說,Golang的程式可以透過go command直接在眾多的作業系統與幾種不同的CPU架構下執行。

進一步來說,也可以把Golang程式編譯/或交叉編譯 到不同的作業系統與不同的CPU架構下成為執行檔案,即可直接執行。其內涵不了解沒有關係,這不防礙接下來安裝的步驟。


[安裝Golang]

我這邊只先舉Windows 10的安裝範例,對於Linux或是Mac的作業系統,網路上應該有很多安裝教學可以參考ㄡ~

首先請用點擊下列Golang官方下載網頁:

https://go.dev/dl/

[用Golang寫小遊戲教學] 第二章 基本型別、變數宣告與常數宣告

[前言]

了解"基本型別"與"變數宣告"是開始學習程式語言的第一步。我們其實不需要一次把所有的觀念與知識都學到位,這對於初學者或是小朋友來說太過於複雜,這裡就先介紹比較常見的部分。

這篇的教學還不需要用到本機上安裝的Go來執行,我們會用 The Go Playground (網頁版)來練習。


[變數宣告]

在電腦的世界中,每個程式都需要在記憶體中儲存一些資料,資料被儲存在特定的記憶體位置,變數只是為儲存資料的記憶體位置所取的一個方便的名稱。除了名稱外,每個變數還有關聯的型別。型別用來定義存放的資料是屬於何種型態,像是整數或是字串等等,在後面的段落將說明何為資料型別。

    我們先看一個例子: var myScore int = 100,並參考下圖

Thursday, December 23, 2021

[用Golang寫小遊戲教學] 第零章 大綱

[前言]

曾經有位朋友與我討論軟體工程師如何寫好程式(或是開發出好的軟體),我依稀記得是這樣回答:

"木匠製作椅子為例子來說,他(木匠)本身需要具備身為木匠的能力,例如: 鋸木、裁切、刨木、鑽孔、拋光、上漆等等功夫,接下來透過不斷的實作成品的鍛鍊,可以學習到製作越來越複雜的木工成品,當累積一段時間之後,會有自己的風格與設計架構對於擅長的木工項目。

同理可推,在軟體工程師的角度來說,是須要懂得電腦基本概念、了解作業系統的運行、與熟悉某種程式語言,這是基本功。在不斷的實作過程中累積出自己的實力,才有可能寫出好的程式。"

這樣的回答可能沒有完全說服那位朋友,是基本功對於一般人來說,會是個門檻與障礙。

對於像是不具備相關背景的大朋友們,可能會有心理障礙而不敢學習寫程式,擔心學習門檻很高或是學不會。對於小朋友們來說,過早就進入複雜的背景知識或是學習太多程式語言的細節,不只無法理解其內容,並且會快速遇到瓶頸而備受打擊,或是失去學習程式的動力與興趣。


[教學內容列表]

Friday, December 10, 2021

[用Golang寫小遊戲教學] 第三章 初探Ebiten (A dead simple 2D game library for Go)

[前言]

Ebiten 官方網站 (The official website)

用Golang寫小遊戲教學這一系列的內容,將會以一個基於Golang語言的 2D Game Library: Ebiten,對於製作小遊戲來說,感覺簡單又易於使用 。Ebiten 套件原作者是日本人,少量遊戲作品可在 wiki 中找到: https://github.com/hajimehoshi/ebiten/wiki/Works

很多使用範例可以學習: