自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go 學(xué)習(xí):從環(huán)境搭建到寫一個(gè) Web 服務(wù)

開發(fā) 前端
用 Go 寫一個(gè) Web 程序,通過界面的簡單配置和 shell 腳本的相結(jié)合,可以打打降低部署的難度。

最近學(xué)習(xí)了 Go 語言,做下記錄。

Go 的來歷

和 C、C++ 相比, Go 是一門很年輕的語言。2007 年,在 Google 的內(nèi)部,有三位大佬因?yàn)?C++ 的復(fù)雜性、構(gòu)建編譯速度很慢和對(duì)并發(fā)支持不好等原因,便決定開發(fā)一門新的語言,于是他們基于 C 語言,做了功能的刪減和新增,便有了 Go 的誕生。

2009 年 10 月 30 日,在 Google Techtalk 上,Go 語言的初始三位創(chuàng)始人之一的羅伯·派克做了一次關(guān)于 Go 語言的演講,這也是 Go 語言第一次公開露面。十天后,谷歌正式宣布 Go 語言項(xiàng)目開源。

2012 年 3 月 28 日,Go 1.0 版本正式發(fā)布,同時(shí) Go 官方發(fā)布了 “Go 1 兼容性” 承諾:只要符合 Go 1 語言規(guī)范的源代碼,Go 編譯器將保證向后兼容(backwards compatible),這給開發(fā)者帶來了安全感。

Go 的特點(diǎn)

  • 只有 25 個(gè)關(guān)鍵字,主流編程語言最少。
  • 內(nèi)置垃圾收集,這是相比較 C 語言而言,(C# 和 Java 也有垃圾收集)。
  • 方法或變量的首字母大小寫決定可見性,無需通過額外的訪問修飾符,太喜歡這個(gè)了。
  • 內(nèi)置接口類型,為程序的組合帶來方便。
  • 變量初始為類型零值,避免以隨機(jī)值作為初值的問題。
  • 函數(shù)或方法中的錯(cuò)誤會(huì)通過 return 語句顯式地返回,調(diào)用者不能忽略對(duì)返回的錯(cuò)誤的處理。
  • 內(nèi)置數(shù)組邊界檢查,減少越界訪問帶來的安全隱患。
  • 內(nèi)置并發(fā)支持,簡化并發(fā)程序設(shè)計(jì),這也是很多人使用 Go 語言的一個(gè)原因。
  • 為了提升可讀性,Go 不支持默認(rèn)函數(shù)參數(shù)。
  • 每個(gè)類型有自己的方法集,類型定義和方法實(shí)現(xiàn)是獨(dú)立的。

相關(guān)網(wǎng)站

  • https://golang.org : Go 原來的官網(wǎng),現(xiàn)在訪問會(huì)跳轉(zhuǎn)到 go.dev 。
  • https://go.dev :  Go 現(xiàn)在的官網(wǎng)。
  • https://pkg.go.dev/ :包管理。
  • https://goproxy.cn/ :傲飛開發(fā)的 Go 模塊代理站,現(xiàn)在由七牛云托管。
  • http://goproxy.io/ : 李保坤開發(fā)的 Go 模塊代理站。

環(huán)境準(zhǔn)備

版本

  • Mac:10.15.7
  • Go:1.19 ,目前最新的版本
  • VS Code:1.71.0

安裝

1、在 https://go.dev/dl 頁面下載 Mac 版本的 pkg 安裝文件:

圖片

2、根據(jù)向?qū)нM(jìn)行 Go 的安裝,程序會(huì)安裝到 /usr/local/go 目錄中。

3、重啟終端、輸入命令 go version ,如果能正確顯示版本號(hào)說明安裝成功。

4、在 VS Code 中安裝 go 擴(kuò)展:

圖片

5、在 VS Code 中敲 cmd+shift+p ,然后輸入 Go:Install ,選擇下圖紅框部分進(jìn)行擴(kuò)展工具的安裝;

圖片

6、全選所有的擴(kuò)展工具,點(diǎn)擊確定,但這時(shí)通常會(huì)出現(xiàn)錯(cuò)誤,不能正常安裝,采用下面第七步的方式可以解決這個(gè)問題:

圖片

7、在 ~/.bash_profile 文件中添加:

export GO111MODULE=on
export GOPROXY=https://goproxy.cn

執(zhí)行 source ~/.bash_profile 使配置生效,然后重新執(zhí)行第六步的擴(kuò)展工具安裝。

8、到這環(huán)境就準(zhǔn)備好了,可以開始寫代碼。

代碼示例

hello world

1、在 go-study 目錄中創(chuàng)建 helloworld 目錄,go-study 是我用來學(xué)習(xí) Go 語言存放代碼的一個(gè)根目錄。

2、使用 VS Code 打開 helloworld 目錄,并在目錄中創(chuàng)建 main.go 文件,內(nèi)容如下:

package main
import (
"fmt"
)
func main() {
fmt.Println("hello oec2003!")
}

3、使用 go run main.go 運(yùn)行程序:

圖片

一個(gè) web 服務(wù)

假設(shè)有這樣一個(gè)場景:

零代碼平臺(tái)涉及到很多不同的服務(wù)和中間件,在客戶服務(wù)器私有化部署時(shí)需要運(yùn)維人員在服務(wù)器上進(jìn)行各種配置才能搞定。

如果用 go 寫一個(gè) web 程序,通過界面的簡單配置和 shell 腳本的相結(jié)合,可以打打降低部署的難度。

下面就來看看怎樣來做這個(gè)簡單配置的 web 程序。

1、創(chuàng)建 deploy-app 目錄,在目錄中創(chuàng)建 main.go 文件,內(nèi)容如下:

package main
import (
"embed"
"io/fs"
"log"
"net"
"net/http"
"os"
)
func main() {
http.Handle("/", http.FileServer(getFileSystem()))
ip, err := getLocalIP()
if err != nil {
return
}
log.Println("啟動(dòng)成功,通過 http://" + ip + ":10002 訪問")
server := http.Server{
Addr: ":10002",
Handler: nil,
}
server.ListenAndServe()
}
//go:embed wwwroot
var embededFiles embed.FS
func getFileSystem(useOS bool) http.FileSystem {
if useOS {
return http.FS(os.DirFS("wwwroot"))
}
fsys, err := fs.Sub(embededFiles, "wwwroot")
if err != nil {
panic(err)
}
return http.FS(fsys)
}
func getLocalIP() (ip string, err error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return
}
for _, addr := range addrs {
ipAddr, ok := addr.(*net.IPNet)
if !ok {
continue
}
if ipAddr.IP.IsLoopback() {
continue
}
if !ipAddr.IP.IsGlobalUnicast() {
continue
}
return ipAddr.IP.String(), nil
}
return
}
  • package :定義名為 main 的包,包名為 main 的包為應(yīng)用程序的入口包。
  • import :導(dǎo)入需要使用的包。
  • go:embed : embed 是在 Go 1.16 中新加的功能,通過 //go:embed 指令,可以在編譯階段將靜態(tài)資源文件打包進(jìn)編譯好的程序中,并提供訪問這些文件的能力。
  • getLocalIP :獲取 IP 的一個(gè)函數(shù)。
  • server.ListenAndServe() :使用該方法可以啟動(dòng)一個(gè) http 的服務(wù)器監(jiān)聽。

2、在 deploy-app 目錄中創(chuàng)建 wwwroot 目錄,在 wwwroot 中創(chuàng)建 idnex.html 文件:

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>瞬翕云私有部署版</title>
<link href="css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
</style>
</head>
<body>
<div>
<div class="text">私有化部署</div>
</div>
<div>
<h2 class="ant-typography">訪問地址設(shè)置</h2>
<div>例:http://fwhyy.com、http://10.211.55.3:9000(支持設(shè)置 域名、域名+端口、IP+端口)</div>
<div>訪問地址</div>
<div class="input-group mb-3">
<span class="input-group-text" id="inputGroup-sizing-default">http://</span>
<input type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default" value="">
</div>
<button type="button" class="btn btn-primary">下一步</button>
</div>
</body>
</html>

3、使用 go run main.go 運(yùn)行看看效果:

圖片

在瀏覽器中使用 http://192.168.1.7:10002 進(jìn)行訪問,如下圖:

圖片

4、使用命令 GOOS=linux GOARCH=amd64 go build main.go 進(jìn)行編譯構(gòu)建,構(gòu)建完成后會(huì)在 deploy-app 目錄中生成一個(gè)名為 main 的二進(jìn)制文件,如下圖:

圖片

5、將 main 文件拷貝到 CentOS 虛擬機(jī)中,使用 ./main 命令運(yùn)行,如下圖:

圖片

可以看到運(yùn)行效果和本機(jī)運(yùn)行的效果相同:

圖片

總結(jié)

1、使用 embed 功能可以將靜態(tài)資源打包到二進(jìn)制的包中。

2、Go 語言編譯后的是一個(gè)二進(jìn)制文件,在服務(wù)器上不需要進(jìn)行運(yùn)行時(shí)的安裝即可運(yùn)行。

3、學(xué)習(xí)任何語言,語法部分可以通過刷刷力扣的題來進(jìn)行熟悉,一個(gè)比較實(shí)用的小技巧。

責(zé)任編輯:姜華 來源: 不止dotNET
相關(guān)推薦

2019-05-08 14:37:49

Web服務(wù)器HTTP

2021-08-03 09:07:39

GolangGrpc服務(wù)

2023-05-10 08:05:41

GoWeb應(yīng)用

2017-06-27 09:26:53

運(yùn)維app開發(fā)

2019-08-26 09:25:23

RedisJavaLinux

2017-05-25 12:40:06

SOA微服務(wù)系統(tǒng)

2022-09-20 08:43:37

Go編程語言Web

2014-10-15 11:01:02

Web應(yīng)用測(cè)試應(yīng)用

2017-06-08 15:53:38

PythonWeb框架

2020-10-29 16:00:03

Node.jsweb前端

2022-02-22 11:57:32

BOAWeb服務(wù)器

2022-07-06 19:00:00

微服務(wù)框架鏈路

2019-08-21 17:41:29

操作系統(tǒng)軟件設(shè)計(jì)

2021-04-25 08:58:00

Go拍照云盤

2014-04-14 15:54:00

print()Web服務(wù)器

2018-07-10 15:15:11

2017-04-11 16:16:48

HTTPS互聯(lián)網(wǎng)服務(wù)端

2017-07-05 15:09:52

密碼token瀏覽器

2015-10-12 16:45:26

NodeWeb應(yīng)用框架

2019-07-31 10:18:17

Web 開發(fā)Python
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)