云端golang開發(fā),無需本地配置,能上網(wǎng)就能開發(fā)和運行
需求
學習golang的時候,需要一個IDE,還需要一個能運行程序的環(huán)境,以及一個MySQL數(shù)據(jù)庫 對于有經(jīng)驗的程序員來說,自己動手安裝部署即可,但是小白和懶人也是存在的...
背景
背景很簡單:欣宸個人情況如下
- 窮:有個能上網(wǎng)的破電腦,甚至電腦都沒有,僅有個安卓平板(萬幸的是有鍵盤鼠標,打字沒問題)
- 懶:不想安裝golang,也不想安裝vscode(如果只有安卓平板,就是想裝也沒辦法裝)
面對這樣無可救藥的自己,內(nèi)心還是想拯救一下,于是有了這篇文章,基于GitHub的Codespaces 快速搭建一套云端開發(fā)環(huán)境,讓窮、懶不再拖累我學習的熱情...
前提
用破電腦憑空打造golang開發(fā)環(huán)境,需要以下兩個前提條件 能上網(wǎng),因為要訪問GitHub
- 有個屬于自己的GitHub賬號 準備好以上條件就開始吧 打造環(huán)境 首先登錄GitHub
- 其次準備好一個代碼倉庫,已有的或現(xiàn)在就新建都可以,我這里用的是舊倉庫,里面保存了多年的博客中用到的源碼,是個超級大雜燴,有java工程的,也有golang的,還有一些ansible腳本,如下所示,不過沒事兒,不影響,都能用
然后按照下圖的數(shù)字順序進行操作,進入云端開發(fā)環(huán)境的設置頁面
然后按照下圖操作,選擇配置模板
按照下圖操作,獲取到配置模板,然后粘貼到自己項目的配置區(qū)域,再提交保存,這樣就完成了自己的golang云開發(fā)環(huán)境配置
注意上面的內(nèi)容,共有兩個配置項
- 部署了go1.18版本,您可以根據(jù)自己的需要修改,我這改成了1.19
- 安裝了docker(配置里叫docker-in-docker,因為咱們的云開發(fā)環(huán)境就是個docker容器,官方文檔中有說明)
然后回到倉庫主頁面,按照如下操作,即可創(chuàng)建一個云開發(fā)環(huán)境,用的是前面的配置
然
后需要等待幾分鐘,GitHub會根據(jù)您的配置創(chuàng)建新的云開發(fā)環(huán)境
稍作等待就會跳轉(zhuǎn)到web版本的vscode頁面,如下圖(安卓平板電腦瀏覽器截圖),資源管理器的內(nèi)容就是您的GitHub倉庫的內(nèi)容,由于我的倉庫中有很多java舊代碼,被vscode識別到之后會提示安裝JDK,請無視掉這些提示,因為它們都和本篇無關
如下圖,在控制臺查看golang和docker的版本,都符合預期,微軟真是給力,web版IDE和服務器都白送
用top命令查看資源情況,發(fā)現(xiàn)是2核4G的服務器資源
其實微軟還算慷慨,免費資源最多給到了4核8G,咱們回到倉庫頁面去調(diào)整一下,如下圖
如
下圖修改配置,并使其立即生效
至此,環(huán)境準備好了,咱們來寫代碼驗證一下
設置GO111MODULE
記得用go env看一下GO111MODULE環(huán)境變量的設置,因為接下來的項目是基于go mod進行管理的,所以要打開這個設置,最好是執(zhí)行以下命令,使其生效
go env -w GO111MODULE=on
驗證之一:helloworld
- 接下來咱們基于gin新建一個web服務,試試這個開發(fā)環(huán)境能否正常使用
- 在web版的vscode上,找個干凈目錄,例如我這邊新建名為test003的文件夾
- 用go mod命令新建module
go mod init test003
下載和安裝gin
go get -u github.com/gin-gonic/gin
新建main.go文件,內(nèi)容如下
package main import "github.com/gin-gonic/gin" func main() { router := gin.Default() router.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello world", }) }) router.Run() }
執(zhí)行go mod tidy解決依賴 最后執(zhí)行go run main.go將服務運行起來
@zq2599 ? /workspaces/blog_demos/tutorials/test003 (dev) $ go run main.go [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] GET / --> main.main.func1 (3 handlers) [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value. Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details. [GIN-debug] Environment variable PORT is undefined. Using port :8080 by default [GIN-debug] Listening and serving HTTP on :8080 [GIN] 2023/02/04 - 14:10:22 | 200 | 58.7μs | 220.246.254.226 | GET "/" [GIN] 2023/02/04 - 14:10:22 | 404 | 900ns | 220.246.254.226 | GET "/favicon.ico"
再去看端口這個Tab頁,如下圖,發(fā)現(xiàn)gin監(jiān)聽的8080端口已經(jīng)被forward到一個公網(wǎng)地址,點擊紅色箭頭的圖標,用瀏覽器訪問這個地址
能夠收到body響應,證明剛才的代碼已經(jīng)生效了,至此云端的IDE和運行環(huán)境都驗證通過
至此,云端開發(fā)運行基本的
web應用沒問題了,咱們再試試數(shù)據(jù)庫的部署和操作
驗證之二:docker部署MySQL
go服務操作MySQL數(shù)據(jù)庫是很常見的,這里咱們也在云開發(fā)環(huán)境驗證一下
現(xiàn)在的環(huán)境已部署了docker服務,所以用docker安裝MySQL最省事兒,一行命令即可
docker run \ --name mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -d \ mariadb:10.3
微軟服務器的網(wǎng)絡情況真好,如下圖,docker鏡像下載得飛快
進入容器
docker exec -it mysql /bin/bash
現(xiàn)在已經(jīng)在MySQL容器中了,執(zhí)行以下命令直接進入mysql命令行模式
mysql -uroot -p123456
新建名為demo的數(shù)據(jù)庫
create database demo; use demo;
數(shù)據(jù)庫準備完畢,接下來接著剛才的module繼續(xù)開發(fā),先安裝gorm和MySQL驅(qū)動
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql
再在gin上新增一個路由,對應的操作是接收求參數(shù),在數(shù)據(jù)庫新增一條記錄,由于代碼過于簡單就不多廢話了,在下面直接全部貼出來
package main import ( "fmt" "strconv" "github.com/gin-gonic/gin" "gorm.io/driver/mysql" "gorm.io/gorm" ) type Student struct { gorm.Model Name string Age uint64 } // 全局數(shù)據(jù)庫 db var db *gorm.DB // 包初始化函數(shù),可以用來初始化 gorm func init() { // 賬號 username := "root" // 密碼 password := "123456" // mysql 服務地址 host := "127.0.0.1" // 端口 port := 3306 // 數(shù)據(jù)庫名 Dbname := "demo" // 拼接 mysql dsn,即拼接數(shù)據(jù)源,下方 {} 中的替換參數(shù)即可 // {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local&timeout=10s&readTimeout=30s&writeTimeout=60s // timeout 是連接超時時間,readTimeout 是讀超時時間,writeTimeout 是寫超時時間,可以不填 dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname) // err var err error // 連接 mysql 獲取 db 實例 db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("連接數(shù)據(jù)庫失敗, error=" + err.Error()) } // 設置數(shù)據(jù)庫連接池參數(shù) sqlDB, _ := db.DB() // 設置數(shù)據(jù)庫連接池最大連接數(shù) sqlDB.SetMaxOpenConns(10) // 連接池最大允許的空閑連接數(shù),如果沒有sql任務需要執(zhí)行的連接數(shù)大于2,超過的連接會被連接池關閉 sqlDB.SetMaxIdleConns(2) // 建表 db.AutoMigrate(&Student{}) } func main() { router := gin.Default() router.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello world", }) }) router.GET("/create", func(c *gin.Context) { name := c.DefaultQuery("name", "小王子") ageStr := c.DefaultQuery("age", "1") var age uint64 var err error if age, err = strconv.ParseUint(ageStr, 10, 32); err != nil { age = 1 } fmt.Printf("name [%v], age [%v]\n", name, age) student := &Student{ Name: name, Age: age, } if err := db.Create(student).Error; err != nil { c.JSON(500, gin.H{ "code": 0, "message": "insert db error", }) return } c.JSON(200, gin.H{ "code": 0, "message": fmt.Sprintf("insert db success [%+v]", student.Model.ID), }) }) router.Run() }
再次執(zhí)行go
run main.go運行應用,繼續(xù)使用云開發(fā)環(huán)境給出的forward地址,如下圖紅色箭頭所指,這次要在后面加上path和參數(shù)/create?name=Tom&age=10
瀏覽器成返回新增記錄的id
登錄MySQL查一下表,如下,數(shù)據(jù)全部寫入成功
root@5e9f15ab9ac1:/# mysql -uroot -p123456 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 42 Server version: 10.3.37-MariaDB-1:10.3.37+maria~ubu2004 mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use demo; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [demo]> select * from students; +----+-------------------------+-------------------------+------------+------+------+ | id | created_at | updated_at | deleted_at | name | age | +----+-------------------------+-------------------------+------------+------+------+ | 1 | 2023-02-05 02:05:56.733 | 2023-02-05 02:05:56.733 | NULL | Tom | 10 | | 2 | 2023-02-05 02:09:35.537 | 2023-02-05 02:09:35.537 | NULL | Tom | 10 | | 3 | 2023-02-05 02:10:43.815 | 2023-02-05 02:10:43.815 | NULL | Tom | 10 | | 4 | 2023-02-05 02:10:45.069 | 2023-02-05 02:10:45.069 | NULL | Tom | 10 | | 5 | 2023-02-05 02:10:45.717 | 2023-02-05 02:10:45.717 | NULL | Tom | 10 | | 6 | 2023-02-05 02:10:46.000 | 2023-02-05 02:10:46.000 | NULL | Tom | 10 | | 7 | 2023-02-05 02:10:46.213 | 2023-02-05 02:10:46.213 | NULL | Tom | 10 | | 8 | 2023-02-05 02:10:46.578 | 2023-02-05 02:10:46.578 | NULL | Tom | 10 | | 9 | 2023-02-05 02:10:46.780 | 2023-02-05 02:10:46.780 | NULL | Tom | 10 | | 10 | 2023-02-05 02:10:46.976 | 2023-02-05 02:10:46.976 | NULL | Tom | 10 | | 11 | 2023-02-05 02:10:47.155 | 2023-02-05 02:10:47.155 | NULL | Tom | 10 | | 12 | 2023-02-05 02:10:47.359 | 2023-02-05 02:10:47.359 | NULL | Tom | 10 | +----+-------------------------+-------------------------+------------+------+------+ 12 rows in set (0.000 sec)
桌面版
可能有些讀者對網(wǎng)頁面的IDE心存顧慮:操作流暢度和體驗方面與傳統(tǒng)桌面版有差距,或者說習慣了桌面版(主要是不像欣宸這么窮,破電腦只夠運行瀏覽器),這時候還可以用本地桌面版遠程連接云開發(fā)環(huán)境,這時候編碼在本地vscode,而編譯運行還在之前的云環(huán)境進行,既解決了習慣問題,又不影響白嫖微軟服務器,依舊是快樂滿滿,具體操作方法如下,點擊紅色箭頭所指的菜單
此時瀏覽器就會拉起本地vscode
拉起的過程可能沒那么順利,會要求您的vscode登錄GitHub賬號,然后再重新拉起,多折騰幾次就可以了,拉起后的效果如下,和在本地運行項目看不出區(qū)別
一切都符合預期,可見微軟誠不欺我,4核8G服務器資源免費用,誠意滿滿
這下似乎找不到偷懶的理由了,電腦破沒關系,不想安裝設置也沒關系,沒有服務器也沒關系,GitHub都為你準備好了,還有什么理由不靜下心來認真學習呢?
了解更多codespaces詳情,請訪問官方資料:https://docs.github.com/zh/codespaces/overview
到此這篇關于云端golang開發(fā),無需本地配置,能上網(wǎng)就能開發(fā)和運行的文章就介紹到這了,更多相關云端golang開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- VsCode搭建Go語言開發(fā)環(huán)境的配置教程
- GO語言運行環(huán)境下載、安裝、配置圖文教程
- win7下配置GO語言環(huán)境 + eclipse配置GO開發(fā)
- Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關配置
- VS Code配置Go語言開發(fā)環(huán)境的詳細教程
- vim配置go語言語法高亮問題的解決方法
- 使用Go語言實現(xiàn)配置文件熱加載功能
- Mac下Vs code配置Go語言環(huán)境的詳細過程
- linux中用shell快速安裝配置Go語言的開發(fā)環(huán)境
- 使用VSCODE配置GO語言開發(fā)環(huán)境的完整步驟
相關文章
Go語言模型:string的底層數(shù)據(jù)結構與高效操作詳解
這篇文章主要介紹了Go語言模型:string的底層數(shù)據(jù)結構與高效操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Go實現(xiàn)分布式系統(tǒng)高可用限流器實戰(zhàn)
這篇文章主要為大家介紹了Go實現(xiàn)分布式系統(tǒng)高可用限流器實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06Go?并發(fā)編程協(xié)程及調(diào)度機制詳情
這篇文章主要介紹了Go并發(fā)編程協(xié)程及調(diào)度機制詳情,協(xié)程是Go語言最大的特色之一,goroutine的實現(xiàn)其實是通過協(xié)程,更多相關內(nèi)容需要的朋友可以參考一下2022-09-09