Go語言與數據庫開發:01-09

包和工具

Go語言有超過100個的標準包(譯注:可以用 go list std | wc -l 命令查看標準包的具體數
目),標準庫為大多數的程序提供了必要的基礎構件。在Go的社區,有很多成熟的包被設
計、共享、重用和改進,目前互聯網上已經發布了非常多的Go語音開源包,它們可以通過
http://godoc.org 檢索。

Go還自帶了工具箱,里面有很多用來簡化工作區和包管理的小工具。

包簡介

任何包系統設計的目的都是為了簡化大型程序的設計和維護工作,通過將一組相關的特性放
進一個獨立的單元以便于理解和更新,在每個單元更新的同時保持和程序中其它單元的相對
獨立性。這種模塊化的特性允許每個包可以被其它的不同項目共享和重用,在項目范圍內、
甚至全球范圍統一的分發和復用。

每個包一般都定義了一個不同的名字空間用于它內部的每個標識符的訪問。每個名字空間關
聯到一個特定的包,讓我們給類型、函數等選擇簡短明了的名字,這樣可以避免在我們使用
它們的時候減少和其它部分名字的沖突。

每個包還通過控制包內名字的可見性和是否導出來實現封裝特性。通過限制包成員的可見性
并隱藏包API的具體實現,將允許包的維護者在不影響外部包用戶的前提下調整包的內部實
現。通過限制包內變量的可見性,還可以強制用戶通過某些特定函數來訪問和更新內部變
量,這樣可以保證內部變量的一致性和并發時的互斥約束。

當我們修改了一個源文件,我們必須重新編譯該源文件對應的包和所有依賴該包的其他包。
即使是從頭構建,Go語言編譯器的編譯速度也明顯快于其它編譯語言。Go語言的閃電般的編
譯速度主要得益于三個語言特性。第一點,所有導入的包必須在每個文件的開頭顯式聲明,
這樣的話編譯器就沒有必要讀取和分析整個源文件來判斷包的依賴關系。第二點,禁止包的
環狀依賴,因為沒有循環依賴,包的依賴關系形成一個有向無環圖,每個包可以被獨立編
譯,而且很可能是被并發編譯。第三點,編譯后包的目標文件不僅僅記錄包本身的導出信
息,目標文件同時還記錄了包的依賴關系。因此,在編譯一個包的時候,編譯器只需要讀取
每個直接導入包的目標文件,而不需要遍歷所有依賴的的文件

導入路徑

每個包是由一個全局唯一的字符串所標識的導入路徑定位。出現在import語句中的導入路徑也
是字符串。
import (
"fmt"
"math/rand"
"encoding/json"
"golang.org/x/net/html"
"github.com/go-sql-driver/mysql"
)

Go語言的規范并沒有指明包的導入路徑字符串的具體含義,導
入路徑的具體含義是由構建工具來解釋的。

也有第三方擴展的工具箱存在。例如,Google
公司內部的Go語言碼農,他們就使用內部的多語言構建系統。用不同的規則來處理包名字和定位包,
用不同的規則來處理單元測試等等,因為這樣可以更緊密適配他們內部環境。

如果你計劃分享或發布包,那么導入路徑最好是全球唯一的。為了避免沖突,所有非標準庫
包的導入路徑建議以所在組織的互聯網域名為前綴;而且這樣也有利于包的檢索。例如,上
面的import語句導入了Go團隊維護的HTML解析器和一個流行的第三方維護的MySQL驅動。

包聲明

在每個Go語音源文件的開頭都必須有包聲明語句。包聲明語句的主要目的是確定當前包被其
它包導入時默認的標識符。

例如,math/rand包的每個源文件的開頭都包含 package rand 包聲明語句,所以當你導入這個
包,你就可以用rand.Int、rand.Float64類似的方式訪問包的成員。
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Int())
}

通常來說,默認的包名就是包導入路徑名的最后一段,因此即使兩個包的導入路徑不同,它
們依然可能有一個相同的包名。例如,math/rand包和crypto/rand包的包名都是rand。

關于默認包名一般采用導入路徑名的最后一段的約定也有三種例外情況。第一個例外,包對
應一個可執行程序,也就是main包,這時候main包本身的導入路徑是無關緊要的。

名字為main的包是給go build構建命令一個信息,這個包編譯完之后必須調用連接器生
成一個可執行程序。

第二個例外,包所在的目錄中可能有一些文件名是以test.go為后綴的Go源文件,并且這些源文件聲明的包名也是以
_test為后綴名的。這種目錄可以包含兩種包:一種普通包,加一種則是測試的外部擴展包。
所有以_test為后綴包名的測試外部擴展包都由go test命令獨立編譯,普通包和測試的外部擴
展包是相互獨立的。

第三個例外,一些依賴版本號的管理工具會在導入路徑后追加版本號信息

導入聲明

可以在一個Go語言源文件包聲明語句之后,其它非導入聲明語句之前,包含零到多個導入包
聲明語句。每個導入聲明可以單獨指定一個導入路徑,也可以通過圓括號同時導入多個導入
路徑。

下面兩個導入形式是等價的,但是第二種形式更為常見。
import "fmt"
import "os"
import (
"fmt"
"os"
)

導入的包之間可以通過添加空行來分組;通常將來自不同組織的包獨自分組。包的導入順序
無關緊要,但是在每個分組中一般會根據字符串順序排列。

import (
"fmt"
"html/template"
"os"
"golang.org/x/net/html"
"golang.org/x/net/ipv4"
)

如果我們想同時導入兩個有著名字相同的包,例如math/rand包和crypto/rand包,那么導入聲
明必須至少為一個同名包指定一個新的包名以避免沖突。這叫做導入包的重命名。
import (
"crypto/rand"
mrand "math/rand" // alternative name mrand avoids conflict
)

導入包的重命名只影響當前的源文件。其它的源文件如果導入了相同的包,可以用導入包原
本默認的名字或重命名為另一個完全不同的名字。
導入包重命名是一個有用的特性,它不僅僅只是為了解決名字沖突。如果導入的一個包名很
笨重,特別是在一些自動生成的代碼中,這時候用一個簡短名稱會更方便。選擇用簡短名稱
重命名導入包時候最好統一,以避免包名混亂。選擇另一個包名稱還可以幫助避免和本地普
通變量名產生沖突。例如,如果文件中已經有了一個名為path的變量,那么我們可以
將"path"標準包重命名為pathpkg。
每個導入聲明語句都明確指定了當前包和被導入包之間的依賴關系。如果遇到包循環導入的
情況,Go語言的構建工具將報告錯誤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279666.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 文本后圖標_如何在Android中更改文本,圖標等的大小

android 文本后圖標Let’s face it: no matter how good the screens are on our phones and tablets, the text can sometimes be too tiny if you have poor eyesight. The good news is that there are a variety of methods to help you alleviate squinting just to make …

Code Chef February Challenge 2019題解

傳送門 \(HMAPPY2\) 咕 話說這題居然卡\(scanf\)的么??? int T;cin>>T; while(T--){cin>>n>>a>>b>>k;puts(n/an/b-n/(a*b/__gcd(a,b))*2>k?"Win":"Lose"); } \(CHEFING\) 咕咕 int T;…

Linux文本查看命令之uniq

uniq是專用的去重命令限制:必須相鄰的兩行內容相同才算是重復,如果內容相同,但是兩行之間有其他內容就不算重復。使用uniq命令先排序,再去重。-d 的選項是用來僅顯示重復行的-u 僅顯示不重復的行-c 統計每一行出現的次數本文轉自 …

BitMap位圖與海量數據的理解與應用

1. Bit Map算法簡介 來自于《編程珠璣》。所謂的Bit-map就是用一個bit位來標記某個元素對應的Value, 而Key即是該元素。由于采用了Bit為單位來存儲數據,因此在存儲空間方面,可以大大節省。 2、 Bit Map的基本思想 我們先來看一個具體的例子&a…

imdb文件_如何停止IMDB應用程序向您發送通知

imdb文件Recently, the IMDB app started sending out notifications for “Featured Trailers”. As near as I can guess, this is where the production company pays IMDB to push a link to the trailer to a load of people in an effort to promote it. If IMDB isn’t …

科普:BCH能夠買什么?如何使用BCH買東西?

2019獨角獸企業重金招聘Python工程師標準>>> 一提到BCH,你最想拿它做什么?可能對于投資者來說,它是暴富的神器,是投資的工具;對于開發者來說,是實現自身價值構建應用程序的網絡和平臺&#xff0…

驅動學習之驅動體驗

1:什么是linux驅動 從本質上講,驅動就是屬于內核層面的程序代碼,是直接和硬件打交道的。與裸機中直接操作寄存器去操作硬件的不同之處在于,裸機中操作的是物理內存,而我們在驅動中操作的是虛擬內存,驅動中還…

vim(三)golang代碼跳轉配

在golang的代碼里跳來跳去。。。。 godef 安裝 跳轉是通過godef實現,godef的安裝目錄一般是$GOBIN,只要讓godef命令在$PATH下即可 godef 命令安裝: go get -v github.com/rogpeppe/godef go install -v github.com/rogpeppe/godef vim插件安裝 ~/.vimrc配…

如何將iPhone或iPad更新到iOS 11

Apple released iOS 11 on September 19, 2017. You can upgrade by tapping “Install Now” when an update message appears, but you can also check for the update and install it immediately. 蘋果于2017年9月19日發布了iOS11 。您可以通過在出現更新消息時點按“立即安…

三、Python-列表

三、Python-列表 一、序列:是一塊用于存放多個值的連續內存空間,并且按一定順序排列,可以通過索引取值索引:從左到右的索引從0開始依次增加的正整數;從右到左的索引為-1開始的復數切片(分片)&am…

使用基本ACL規則限制用戶登錄

要求:配置ACL 2005規則,限制vty 0 4界面只允許IP地址為192.168.1.8的用戶和10.10.100.0/24網段的用戶登錄設備。 配置如下: system-view acl 2005 rule permit source 192.168.1.8 0 //允許IP地址為192.168.1.8的用戶登錄設備 rule permit s…

pandas 入門(2)

from pandas import Series, DataFrame, Index import numpy as np from numpy import nan as NAobj Series(range(3), index[a, b, c]) print(obj) index obj.index print(index) print(index[1:]) # index[1] d index對象時不可以被修改的 為了安全和共享index Index(n…

如何在Outlook 2013中管理附件

There comes a time, job-hunting, or sharing photos with older family members, where you may need to send stuff the old fashioned way – as an email attachment. If you email at work, it may be a part of your email repertoire. 有時需要找工作,與年長…

了解cron以及使用cron定時備份MySQL

cron是一個linux下的定時執行工具,可以在無需人工干預的情況下運行作業。由于Cron 是Linux的內置服務,但它不自動起來,可以用以下的方法啟動、關閉這個服務: /sbin/service crond start //啟動服務 /sbin/service crond stop //關…

ef 并發控制

ef 并發控制 ef 并發控制 什么是并發?并發分悲觀并發和樂觀并發。悲觀并發:比如有兩個用戶A,B,同時登錄系統修改一個文檔,如果A先進入修改,則系統會把該文檔鎖住,B就沒辦法打開了,只有等A修改完…

C#實現寫入文本文件內容功能

private void write_txt(string str1, string str2, string str3)02{03System.DateTime currentTime System.DateTime.Now;04string strYMD currentTime.ToString("d");05string FILE_NAME "MyFileSend" strYMD ".txt";//每天按照日期建立一…

如何在Windows上設置BitLocker加密

BitLocker is a tool built into Windows that lets you encrypt an entire hard drive for enhanced security. Here’s how to set it up. BitLocker是Windows內置的工具,可用于加密整個硬盤驅動器以增強安全性。 設置方法如下。 When TrueCrypt controversially …

Java字節碼方法表與屬性表深度剖析

方法表: 在上一次咱們已經分析到了字段信息了,如下: 緊接著就是方法相關的信息了: 而它展開之后的結構為: 所以往后數2個字節,看一下方法的總數: 3個方法,可咱們只定義了兩個方法呀&…

最大連續子數組和與JUnit測試

【題目】最大連續子數組和(最大子段和) 背景 問題: 給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]a[i1]…a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義…

筆記本電源適配器為什么總壞_為什么某些交流適配器和電源會發出嘯叫聲?

筆記本電源適配器為什么總壞Most of the time our AC adapters and power supplies tend to be quiet, but what does it mean when one makes a whining noise? Should you be concerned? Today’s SuperUser Q&A post has the answers to a worried reader’s question…