搜尋
首頁後端開發GolangGo 的嬰兒學步

Baby steps with Go

我決定在我的旅程中嘗試 Go,以學習一門對我的職業和興趣有用的新語言。這次我嘗試了Go。我認為第一印象非常好。

這不是一個導遊,可以說,不是為除了我自己以外的任何人編寫的,作為一些個人提醒。

我為自己做了一個小項目,名為 Os-Release-Q 。我的目的是能夠在我管理的任何系統上都有一個二進位文件,這樣我就可以準確地列印我需要的信息,而無需對其進行解析或eye-grep。

第一個障礙:進口

網路上搜尋很多關於導入別人的包的內容,但很少談到組織自己的程式碼。甚至文件也關注 go get 而不是關注點分離。

我在每種語言中都會遇到這個障礙,因為每種語言對於如何實現它都有自己獨特的哲學,以及每種語言有或強加的限制。

在我學習基礎知識的所有活動中,由於主要是Python背景,將我的程式碼分成多個檔案是我花了最長的時間才得到答案的事情。總而言之,我發現了以下內容:

  • 頂層需要一個 go.mod 宣告模組 module-name
  • 然後我可以在頂層設定一個 src/ 目錄,並在其中放置我的 main 函數,並在頂部設定一個套件 main 聲明
  • 將程式碼放入其他檔案中非常簡單,只需建立一個帶有包主聲明的檔案(如 src/others.go)即可。
  • 所有函數和變數都可以直接在 main 套件的任何其他檔案中使用,但需要在 go build FILES 呼叫中明確聲明這些檔案

對於本機子模組,子模組必須駐留在資料夾中。它可以宣告一個套件 submodule-name .

假設它在 src/submod/ 中,主要實現者在 src/submod/submod.go 中。在 main.go 中,我們導入「module-name/src/submod」(模組名稱是從 go.mod 中提取的)。然後我們可以呼叫 submod.SomeFunction().

我們注意到,子模組函數僅適用於名稱以大寫字母開頭的導入者。所以不要做 submod.myFunction() - 它必須是 submod.MyFunction().

關於子模組和導入肯定還有其他考慮因素,但就保持程式碼組織和隔離而言,這是必不可少的。

為了保持理智,我試圖只使用一個檔案來聲明 package main,並將其餘部分隔離到子模組中 - 這些會自動導入,無需在 go build FILES 檔案清單中聲明。

執行基本任務

在解決了 Go 的特殊性之後,其餘的事情就很容易解決了。對於每個基本任務,當然都有一個 StackOverflow 條目,或一個 GoByExample.com 頁面,更基本的是 Go 語言參考。

  • 字串處理是透過 strings 套件完成的
  • 陣列處理有許多本機函數,其中 base_array =append(base_array, item1, item2) 模式 - 它也適用於透過append(base, other_array...) 用另一個陣列的值擴展一個陣列
  • 錯誤處理通常是透過傳遞錯誤物件來完成的,但不一定。
  • 存在一個「日誌」庫,用於方便的預先配置無幹擾日誌。它包括一個 log.Fatal(message) 調用,該調用會記錄錯誤並立即退出。
  • 透過「os/exec」函式庫使用 exec.Command(base, args...) 模式呼叫子程序很容易

兩個特別常見的任務值得擁有自己的段落。

錯誤處理

基本錯誤處理通常被認為很麻煩,實際上需要在控制流程中處理錯誤。對於來自 try/catch 工作流程的程式設計師來說,這可能是令人厭惡的,但在可能發生的情況下處理問題並不是那麼糟糕。

// explicit return item `err` forces us to be aware of it
// but having the ability to check it in the same breath is not so bad
if result, err := someCall(); err != nil {
    log.Fatal("Sorry.")
}

// Equally valid is
/*
result, err := someCall()
if err != nil {
    log.Fatal("Sorry")
}
*/

fmt.Println(result)

比較try/catch方式

try:
    result = someCall()
    print(result)
except:
    print("Sorry") # a little divorced from potential origin of error
    sys.exit(1)

參數解析

我不禁覺得flags函式庫的實作有點半生不熟。顯然,考慮到它以目前的形式生存下來,人們已經習慣了它並且對此表示滿意。

呼叫程式 -flag arg1 arg2 為我們提供了 flag 設定為執行的切換,positionals := flags.Args() 傳回 ["arg1", "arg2"] 陣列

但是呼叫程式arg1 arg2 -flag 不會切換-flags 應該執行的任何操作,而是給出位置作為["arg1", "arg2", "-flag"] 其中標誌未解析。

這對於傳遞像程式 colorize ls -l 這樣的子呼叫可能很有用,其中 ls -l 按字面意思傳遞 - 這樣我就可以看到一個用例。

只是大多數程式都允許在位置項目周圍的任何地方使用標誌參數。 ls dir1/ -l dir2/ 與 ls -l dir1/ dir2/ 相同,這是一個適用於絕大多數 Unix 和 Linux 指令的約定。

這可能只是需要習慣的事情 - 並且值得呼籲。

Go 的目的和用例

除了檔案匯入範例之外,我發現實作我的基本應用程式非常容易。我做錯的任何事情都感覺相當明顯,而且這些錯誤是有意義的。確實感覺我可以專注於「把事情做好」。

從我迄今為止微薄的使用量來看,並考慮到我的具體需求,我可以看到

  • 易於上手
  • 編譯的二進位文件,無運行時依賴
  • 有類型的簡單語言是 shell 腳本的一個進步
  • 據稱簡單的多處理支援

我認為使用稀疏類型而不是物件和繼承會是一個障礙,但到目前為止還不錯。我在其他語言中不需要它們,所以我想當我開始定義介面和類型時,感覺就像是 Lua 和 bash 的一個進步。我希望。

我想探索編譯為本機語言的原因之一是能夠產生可以輕鬆分流的二進位文件,而不需要依賴存在的特定版本的執行時間。

一位同事最近沮喪地走到我的辦公桌前,試圖解決將 Java 17 移植到基於 Debian 10 的舊 Node 基礎鏡像上的問題。他要么必須升級Node 版本以獲得更新的基礎鏡像,使用新的Debian 基礎鏡像並手動安裝和配置Node,要么在互聯網上搜索由“好人知道”託管的自定義存儲庫以獲得“好人知道” -if -hacked Java 17 將在Debian 10 上運行。

如果部署的軟體沒有這種相互衝突的運行時依賴關係,該有多容易......

從維運的角度來看,我覺得我能感受到的一大收穫是:我可以輕鬆編寫程式碼,並建立一個ELF 二進位文件,然後部署在「任意系統X」上,而不必與確保給定運行時的正確版本到位,並管理衝突的依賴項。

我確信還有其他好處,而且我聽過很多關於Go 中多線程和多處理的易用性的說法,我確實打算製作一個迷你項目來探索這一點,作為下一步-可能會監聽多個通道上的輸入,並執行一些基本任務作為回應。我在之前的一些測試自動化任務中已經有過這樣的用例,所以此時它對我來說並不陌生。

以上是Go 的嬰兒學步的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
測試代碼依賴於INET功能的代碼測試代碼依賴於INET功能的代碼May 03, 2025 am 12:20 AM

whentestinggocodewithinitfunctions,useexplicitseTupfunctionsorseParateTestFileSteSteTepteTementDippedDependendendencyOnInItfunctionsIdeFunctionSideFunctionsEffect.1)useexplicitsetupfunctionStocontrolglobalvaribalization.2)createSepEpontrolglobalvarialization

將GO的錯誤處理方法與其他語言進行比較將GO的錯誤處理方法與其他語言進行比較May 03, 2025 am 12:20 AM

go'serrorhandlingurturnserrorsasvalues,與Javaandpythonwhichuseexceptions.1)go'smethodensursexplitirorhanderling,propertingrobustcodebutincreasingverbosity.2)

設計有效界面的最佳實踐設計有效界面的最佳實踐May 03, 2025 am 12:18 AM

AnefactiveInterfaceingoisminimal,clear and promotesloosecoupling.1)minimizeTheInterfaceForflexibility andeaseofimplementation.2)useInterInterfaceForabStractionToswaPimplementations withoutchangingCallingCode.3)

集中式錯誤處理策略集中式錯誤處理策略May 03, 2025 am 12:17 AM

集中式錯誤處理在Go語言中可以提升代碼的可讀性和可維護性。其實現方式和優勢包括:1.將錯誤處理邏輯從業務邏輯中分離,簡化代碼。 2.通過集中處理錯誤,確保錯誤處理的一致性。 3.使用defer和recover來捕獲和處理panic,增強程序健壯性。

init in Init函數的替代方案,用於go中的包裝初始化init in Init函數的替代方案,用於go中的包裝初始化May 03, 2025 am 12:17 AM

Ingo,替代詞InivestoIniTfunctionsIncludeCustomInitializationfunctionsandsingletons.1)customInitializationfunctions hownerexpliticpliticpliticconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconcontirization curssetupssetupssetups.2)單次固定無元素限制ininconconcurrent

與GO接口鍵入斷言和類型開關與GO接口鍵入斷言和類型開關May 02, 2025 am 12:20 AM

Gohandlesinterfacesandtypeassertionseffectively,enhancingcodeflexibilityandrobustness.1)Typeassertionsallowruntimetypechecking,asseenwiththeShapeinterfaceandCircletype.2)Typeswitcheshandlemultipletypesefficiently,usefulforvariousshapesimplementingthe

使用errors.is和錯誤。使用errors.is和錯誤。May 02, 2025 am 12:11 AM

Go語言的錯誤處理通過errors.Is和errors.As函數變得更加靈活和可讀。 1.errors.Is用於檢查錯誤是否與指定錯誤相同,適用於錯誤鏈的處理。 2.errors.As不僅能檢查錯誤類型,還能將錯誤轉換為具體類型,方便提取錯誤信息。使用這些函數可以簡化錯誤處理邏輯,但需注意錯誤鏈的正確傳遞和避免過度依賴以防代碼複雜化。

在GO中進行性能調整:優化您的應用程序在GO中進行性能調整:優化您的應用程序May 02, 2025 am 12:06 AM

tomakegoapplicationsRunfasterandMorefly,useProflingTools,leverageConCurrency,andManageMoryfectily.1)usepprofforcpuorforcpuandmemoryproflingtoidentifybottlenecks.2)upitizegorizegoroutizegoroutinesandchannelstoparalletaparelalyizetasksandimproverperformance.3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。