go語言的字符串是UTF-8編碼的、不可改變的字節(jié)序列。
創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)二七,10多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
要修改字符串,只能以原串為基礎(chǔ),創(chuàng)建一個新串。下面的圖中是一個參考示例,提供了以原串為藍(lán)本,創(chuàng)建新串的兩種方法。
代碼
輸出
是程序運行太快肉眼分辨不出了,可以睡眠5秒
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("hello world !")
time.Sleep(5 * time.Second)
}
本教程介紹 Go 中多模塊工作區(qū)的基礎(chǔ)知識。使用多模塊工作區(qū),您可以告訴 Go 命令您正在同時在多個模塊中編寫代碼,并輕松地在這些模塊中構(gòu)建和運行代碼。
在本教程中,您將在共享的多模塊工作區(qū)中創(chuàng)建兩個模塊,對這些模塊進行更改,并在構(gòu)建中查看這些更改的結(jié)果。
本教程需要 go1.18 或更高版本。使用go.dev/dl中的鏈接確保您已在 Go 1.18 或更高版本中安裝了 Go 。
首先,為您要編寫的代碼創(chuàng)建一個模塊。
1、打開命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個名為工作區(qū)的目錄。
3、初始化模塊
我們的示例將創(chuàng)建一個hello依賴于 golang.org/x/example 模塊的新模塊。
創(chuàng)建你好模塊:
使用 . 添加對 golang.org/x/example 模塊的依賴項go get。
在 hello 目錄下創(chuàng)建 hello.go,內(nèi)容如下:
現(xiàn)在,運行 hello 程序:
在這一步中,我們將創(chuàng)建一個go.work文件來指定模塊的工作區(qū)。
在workspace目錄中,運行:
該go work init命令告訴為包含目錄中模塊的工作空間go創(chuàng)建一個文件 。go.work./hello
該go命令生成一個go.work如下所示的文件:
該go.work文件的語法與go.mod相同。
該go指令告訴 Go 應(yīng)該使用哪個版本的 Go 來解釋文件。它類似于文件中的go指令go.mod 。
該use指令告訴 Go在進行構(gòu)建時hello目錄中的模塊應(yīng)該是主模塊。
所以在模塊的任何子目錄中workspace都會被激活。
2、運行工作區(qū)目錄下的程序
在workspace目錄中,運行:
Go 命令包括工作區(qū)中的所有模塊作為主模塊。這允許我們在模塊中引用一個包,即使在模塊之外。在模塊或工作區(qū)之外運行g(shù)o run命令會導(dǎo)致錯誤,因為該go命令不知道要使用哪些模塊。
接下來,我們將golang.org/x/example模塊的本地副本添加到工作區(qū)。然后,我們將向stringutil包中添加一個新函數(shù),我們可以使用它來代替Reverse.
在這一步中,我們將下載包含該模塊的 Git 存儲庫的副本golang.org/x/example,將其添加到工作區(qū),然后向其中添加一個我們將從 hello 程序中使用的新函數(shù)。
1、克隆存儲庫
在工作區(qū)目錄中,運行g(shù)it命令來克隆存儲庫:
2、將模塊添加到工作區(qū)
該go work use命令將一個新模塊添加到 go.work 文件中。它現(xiàn)在看起來像這樣:
該模塊現(xiàn)在包括example.com/hello模塊和 `golang.org/x/example 模塊。
這將允許我們使用我們將在模塊副本中編寫的新代碼,而不是使用命令stringutil下載的模塊緩存中的模塊版本。
3、添加新功能。
我們將向golang.org/x/example/stringutil包中添加一個新函數(shù)以將字符串大寫。
將新文件夾添加到workspace/example/stringutil包含以下內(nèi)容的目錄:
4、修改hello程序以使用該功能。
修改workspace/hello/hello.go的內(nèi)容以包含以下內(nèi)容:
從工作區(qū)目錄,運行
Go 命令在go.work文件指定的hello目錄中查找命令行中指定的example.com/hello模塊 ,同樣使用go.work文件解析導(dǎo)入golang.org/x/example。
go.work可以用來代替添加replace 指令以跨多個模塊工作。
由于這兩個模塊在同一個工作區(qū)中,因此很容易在一個模塊中進行更改并在另一個模塊中使用它。
現(xiàn)在,要正確發(fā)布這些模塊,我們需要發(fā)布golang.org/x/example 模塊,例如在v0.1.0. 這通常通過在模塊的版本控制存儲庫上標(biāo)記提交來完成。發(fā)布完成后,我們可以增加對 golang.org/x/example模塊的要求hello/go.mod:
這樣,該go命令可以正確解析工作區(qū)之外的模塊。
直接嵌入c源代碼到go代碼里面
package main
/*
#include stdio.h
void myhello(int i) {
printf("Hello C: %d\n", i);
}
*/
import "C"
import "fmt"
func main() {
C.myhello(C.int(12))
fmt.Println("Hello Go");
}
需要注意的是C代碼必須放在注釋里面
import "C"語句和前面的C代碼之間不能有空行
運行結(jié)果
$ go build main.go ./main
Hello C: 12
Hello Go
分開c代碼到單獨文件
嵌在一起代碼結(jié)構(gòu)不是很好看,很多人包括我,還是喜歡把兩個分開,放在不同的文件里面,顯得干凈,go源文件里面是go的源代碼,c源文件里面是c的源代碼。
$ ls
hello.c hello.h main.go
$ cat hello.h
void hello(int);
$ cat hello.c
#include stdio.h
void hello(int i) {
printf("Hello C: %d\n", i);
}
$ cat main.go
package main
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
編譯運行
$ go build ./main
Hello C: 12
Hello Go
編譯成庫文件
如果c文件比較多,最好還是能夠編譯成一個獨立的庫文件,然后go來調(diào)用庫。
$ find mylib main
mylib
mylib/hello.h
mylib/hello.c
main
main/main.go
編譯庫文件
$ cd mylib
# gcc -fPIC -shared -o libhello.so hello.c
編譯go程序
$ cd main
$ cat main.go
package main
// #cgo CFLAGS: -I../mylib
// #cgo LDFLAGS: -L../mylib -lhello
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
$ go build main.go
運行
$ export LD_LIBRARY_PATH=../mylib
$ ./main
Hello C: 12
Hello Go
在我們的例子中,庫文件是編譯成動態(tài)庫的,main程序鏈接的時候也是采用的動態(tài)庫
$ ldd main
linux-vdso.so.1 = (0x00007fffc7968000)
libhello.so = ../mylib/libhello.so (0x00007f513684c000)
libpthread.so.0 = /lib64/libpthread.so.0 (0x00007f5136614000)
libc.so.6 = /lib64/libc.so.6 (0x00007f5136253000)
/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)
理論上講也是可以編譯成整個一靜態(tài)鏈接的可執(zhí)行程序,由于我的機器上缺少靜態(tài)鏈接的系統(tǒng)庫,比如libc.a,所以只能編譯成動態(tài)鏈接。
rune是Go語言中一種特殊的數(shù)據(jù)類型,它是int32的別名,幾乎在所有方面等同于int32,用于區(qū)分字符值和整數(shù)值,官方解釋如下:
下面我們通過一個例子來看一下:
我們猜測一下結(jié)果,hello5 個字符+1 個空格+3 個漢子,算起來應(yīng)該是 9 個,長度為 9 才對,但是我們執(zhí)行一下,
結(jié)果打印是 15,這是為什么呢?
所以計算出的長度就等于 5+1+3*3=15
如果我們需要計算出字符串的長度,而不是底層字節(jié)的個數(shù),那么可以使用下面的方法:
運行結(jié)果如下:
在 rune 定義上方還有一個,byte = uint8
除了Java、Python和JavaScript之外,如果要開始學(xué)習(xí)一門新語言的話,我想應(yīng)該是Go!
Go語言正在被越來越多的公司使用。我們公司的后端服務(wù)已經(jīng)全面采用Go語言實現(xiàn)了。
最開始接觸Go語言是去年將一份Go代碼“翻譯”成Python并集成到測試平臺上,說來也挺神奇,我從來沒學(xué)過Go卻完成了這個工作,這也側(cè)面反應(yīng)了Go的語法還是很平易近人的。
今年,在海翔飛調(diào)崗之后已經(jīng)沒有太多時間寫代碼了,但如果要開始學(xué)習(xí)一個新的語言或技術(shù)的話,我最想學(xué)的是Go!
目前來看,Go似乎還并沒有太多測試人員使用的場景,不過,我之前介紹過的BDD行為驅(qū)動框架gauge是由Go開發(fā)的,當(dāng)然,它也支持使用Go來編寫B(tài)DD測試代碼。
對于,已經(jīng)有一定開發(fā)經(jīng)驗的同學(xué),如何快速的開始學(xué)習(xí)Go語言呢?我這里給一些思路。
#### 第一步:下載和安裝
在配置環(huán)境的時候你需要重點了解GOROOT、GOPATH的作用。
你還要準(zhǔn)備一款稱手的編輯器,如果你像我一樣,一直都在使用VS Code的話,那么就它就可以了。
#### 第二步:從hello world開始
先運行一個hello world程序,認(rèn)識Go語言的語法。
package main
import ( ? ?"fmt")
func main(){
fmt.Println("helloworld!")
}
#### 第三步:熟悉Go的語法
接下來,你可能要花一周左右的時間熟悉Go語言的語法。比如,變量定義、if/for、函數(shù)、Map、跨文件的程序調(diào)用…等,當(dāng)然,還有一些Go特有的知識。
當(dāng)然,我更喜歡看視頻教程,雖然質(zhì)量參差不齊,但我仍然覺得看視頻比我自己看書更有效率。
熟悉一段Go代碼:
package main
import"fmt"
func myFunc() {
i := 0
Here: ? //這行的第一個詞,以冒號結(jié)束作為標(biāo)簽
fmt.Println(i)
i++ ? ?if i 10{ ? ? ? ?goto Here ? //跳轉(zhuǎn)到Here去
}
}func main() { ? ?//調(diào)用函數(shù)
myFunc()
}
#### 第四步:Go如何做單元測試
針對Go做測試也非常簡單。比如,這是一個被測試文件:add.go。
package test_demofunc Add(a int, b int) int{ ? ?return a + b
}
下面針對Add()函數(shù)編寫測試用例,test_add.go
package test_demo
import ( ? ?"testing")
func TestAdd1(t *testing.T){
r:= Add(1, 2) ? ?if r !=3{
t.Errorf("Add(1, 2)failed. Got %d, expected 3.", r)
}
}
func TestAdd2(t *testing.T){
r:= Add(2, 2) ? ?if r !=4{
t.Errorf("Add(2, 2)failed. Got %d, expected 4.", r)
}
}
你只需要執(zhí)行?go test?命令就可以運行上面的測試了。
#### 第五步:從哪兒找第三方庫
當(dāng)然,你只學(xué)習(xí)go語言本身,基本是做不了什么事的,必須要使用第三方擴展庫。
這里羅列了Go語言的第三方庫,通過這些第三方庫的介紹,我們也可以大概知道Go可以用來干什么。
如果你知道庫的名字的話,也可以在這個網(wǎng)站上搜索。
據(jù)我了解,Go的第三方庫大多都在GitHub上面。
#### 第六步:用Go做Web開發(fā)
Go是靜態(tài)語言,而且支持并發(fā)編程,所以,他有天然的性能優(yōu)勢,大多公司主要使用Go也是開發(fā)后端服務(wù)(即API)。
終于到了實戰(zhàn)階段,如果我們真的要掌握一門語言,那么一定要用它來開發(fā)一個項目出來。這個過程大概需要一個月。
Beego是Go下在主流的Web開發(fā)框架,資料相對比較豐富,而且有完善的文檔。你可為此制定一個目標(biāo),比如用它來開發(fā)一個Blog,為此,你需要詳細(xì)閱讀Beego文檔,以及學(xué)習(xí)相關(guān)的Web開發(fā)技術(shù)。
等你完成這個項目的時候,我想你已經(jīng)會使用Go語言了。