」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Go 的嬰兒學步

Go 的嬰兒學步

發佈於2024-08-23
瀏覽:864

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().

关于子模块和导入肯定还有其他考虑因素,但就保持代码组织和隔离而言,这是必不可少的。

为了保持理智,我试图只使用一个文件来声明包 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 中多线程和多处理的易用性的说法,我确实打算制作一个小型项目来探索这一点,作为下一步 -可能会监听多个通道上的输入,并执行一些基本任务作为响应。我在之前的一些测试自动化任务中已经有过这样的用例,所以此时它对我来说并不陌生。

版本聲明 本文轉載於:https://dev.to/taikedz/baby-steps-with-go-3ibl?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-07-03
  • C++20 Consteval函數中模板參數能否依賴於函數參數?
    C++20 Consteval函數中模板參數能否依賴於函數參數?
    [ consteval函數和模板參數依賴於函數參數在C 17中,模板參數不能依賴一個函數參數,因為編譯器仍然需要對非contexexpr futcoriations contim at contexpr function進行評估。 compile time。 C 20引入恆定函數,必須在編譯時進...
    程式設計 發佈於2025-07-03
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-07-03
  • PHP SimpleXML解析帶命名空間冒號的XML方法
    PHP SimpleXML解析帶命名空間冒號的XML方法
    在php 很少,請使用該限制很大,很少有很高。例如:這種技術可確保可以通過遍歷XML樹和使用兒童()方法()方法的XML樹和切換名稱空間來訪問名稱空間內的元素。
    程式設計 發佈於2025-07-03
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-07-03
  • C++中如何將獨占指針作為函數或構造函數參數傳遞?
    C++中如何將獨占指針作為函數或構造函數參數傳遞?
    在構造函數和函數中將唯一的指數管理為參數 unique pointers( unique_ptr [2啟示。通過值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法將唯一指針的所有權轉移到函數/對象。指針的內容被移至功能中,在操作...
    程式設計 發佈於2025-07-03
  • 在C#中如何高效重複字符串字符用於縮進?
    在C#中如何高效重複字符串字符用於縮進?
    在基於項目的深度下固定字符串時,重複一個字符串以進行凹痕,很方便有效地有一種有效的方法來返回字符串重複指定的次數的字符串。使用指定的次數。 constructor 這將返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.W...
    程式設計 發佈於2025-07-03
  • 查找當前執行JavaScript的腳本元素方法
    查找當前執行JavaScript的腳本元素方法
    如何引用當前執行腳本的腳本元素在某些方案中理解問題在某些方案中,開發人員可能需要將其他腳本動態加載其他腳本。但是,如果Head Element尚未完全渲染,則使用document.getElementsbytagname('head')[0] .appendChild(v)的常規方...
    程式設計 發佈於2025-07-03
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-07-03
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-07-03
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-07-03
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-07-03
  • C++成員函數指針正確傳遞方法
    C++成員函數指針正確傳遞方法
    如何將成員函數置於c 的函數時,接受成員函數指針的函數時,必須同時提供對象的指針,並提供指針和指針到函數。需要具有一定簽名的功能指針。要通過成員函數,您需要同時提供對象指針(此)和成員函數指針。這可以通過修改Menubutton :: SetButton()(如下所示:[&& && && &&華)...
    程式設計 發佈於2025-07-03
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-07-03
  • 同實例無需轉儲複製MySQL數據庫方法
    同實例無需轉儲複製MySQL數據庫方法
    在同一實例上複製一個MySQL數據庫而無需轉儲在同一mySQL實例上複製數據庫,而無需創建InterMediate sqql script。以下方法為傳統的轉儲和IMPORT過程提供了更簡單的替代方法。 直接管道數據 MySQL手動概述了一種允許將mysqldump直接輸出到MySQL cli...
    程式設計 發佈於2025-07-03

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3