go語言實現修改文件名,go語言文件操作

一學就會,手把手教你用Go語言調用智能合約

智能合約調用是實現一個 DApp 的關鍵,一個完整的 DApp 包括前端、后端、智能合約及區(qū)塊 鏈系統(tǒng),智能合約的調用是連接區(qū)塊鏈與前后端的關鍵。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名與空間、虛擬空間、營銷軟件、網站建設、壽寧網站維護、網站推廣。

我們先來了解一下智能合約調用的基礎原理。智能合約運行在以太坊節(jié)點的 EVM 中。因此要 想調用合約必須要訪問某個節(jié)點。

以后端程序為例,后端服務若想連接節(jié)點有兩種可能,一種是雙 方在同一主機,此時后端連接節(jié)點可以采用 本地 IPC(Inter-Process Communication,進 程間通信)機制,也可以采用 RPC(Remote Procedure Call,遠程過程調用)機制;另 一種情況是雙方不在同一臺主機,此時只能采用 RPC 機制進行通信。

提到 RPC, 讀者應該對 Geth 啟動參數有點印象,Geth 啟動時可以選擇開啟 RPC 服務,對應的 默認服務端口是 8545。。

接著,我們來了解一下智能合約運行的過程。

智能合約的運行過程是后端服務連接某節(jié)點,將 智能合約的調用(交易)發(fā)送給節(jié)點,節(jié)點在驗證了交易的合法性后進行全網廣播,被礦工打包到 區(qū)塊中代表此交易得到確認,至此交易才算完成。

就像數據庫一樣,每個區(qū)塊鏈平臺都會提供主流 開發(fā)語言的 SDK(Software Development Kit,軟件開發(fā)工具包),由于 Geth 本身就是用 Go 語言 編寫的,因此若想使用 Go 語言連接節(jié)點、發(fā)交易,直接在工程內導入 go-ethereum(Geth 源碼) 包就可以了,剩下的問題就是流程和 API 的事情了。

總結一下,智能合約被調用的兩個關鍵點是節(jié)點和 SDK。

由于 IPC 要求后端與節(jié)點必須在同一主機,所以很多時候開發(fā)者都會采用 RPC 模式。除了 RPC,以太坊也為開發(fā)者提供了 json- rpc 接口,本文就不展開討論了。

接下來介紹如何使用 Go 語言,借助 go-ethereum 源碼庫來實現智能合約的調用。這是有固定 步驟的,我們先來說一下總體步驟,以下面的合約為例。

步驟 01:編譯合約,獲取合約 ABI(Application Binary Interface,應用二進制接口)。 單擊【ABI】按鈕拷貝合約 ABI 信息,將其粘貼到文件 calldemo.abi 中(可使用 Go 語言IDE 創(chuàng)建該文件,文件名可自定義,后綴最好使用 abi)。

最好能將 calldemo.abi 單獨保存在一個目錄下,輸入“l(fā)s”命令只能看到 calldemo.abi 文件,參 考效果如下:

步驟 02:獲得合約地址。注意要將合約部署到 Geth 節(jié)點。因此 Environment 選擇為 Web3 Provider。

在【Environment】選項框中選擇“Web3 Provider”,然后單擊【Deploy】按鈕。

部署后,獲得合約地址為:0xa09209c28AEf59a4653b905792a9a910E78E7407。

步驟 03:利用 abigen 工具(Geth 工具包內的可執(zhí)行程序)編譯智能合約為 Go 代碼。abigen 工具的作用是將 abi 文件轉換為 Go 代碼,命令如下:

其中各參數的含義如下。 (1)abi:是指定傳入的 abi 文件。 (2)type:是指定輸出文件中的基本結構類型。 (3)pkg:指定輸出文件 package 名稱。 (4)out:指定輸出文件名。 執(zhí)行后,將在代碼目錄下看到 funcdemo.go 文件,讀者可以打開該文件欣賞一下,注意不要修改它。

步驟 04:創(chuàng)建 main.go,填入如下代碼。 注意代碼中 HexToAddress 函數內要傳入該合約部署后的地址,此地址在步驟 01 中獲得。

步驟 04:設置 go mod,以便工程自動識別。

前面有所提及,若要使用 Go 語言調用智能合約,需要下載 go-ethereum 工程,可以使用下面 的指令:

該指令會自動將 go-ethereum 下載到“$GOPATH/src/github.com/ethereum/go-ethereum”,這樣還算 不錯。不過,Go 語言自 1.11 版本后,增加了 module 管理工程的模式。只要設置好了 go mod,下載 依賴工程的事情就不必關心了。

接下來設置 module 生效和 GOPROXY,命令如下:

在項目工程內,執(zhí)行初始化,calldemo 可以自定義名稱。

步驟 05:運行代碼。執(zhí)行代碼,將看到下面的效果,以及最終輸出的 2020。

上述輸出信息中,可以看到 Go 語言會自動下載依賴文件,這就是 go mod 的神奇之處??吹?2020,相信讀者也知道運行結果是正確的了。

Go語言文件操作

本文主要介紹了Go語言中文件讀寫的相關操作。

文件是什么?

計算機中的文件是存儲在外部介質(通常是磁盤)上的數據集合,文件分為文本文件和二進制文件。

os.Open() 函數能夠打開一個文件,返回一個 *File 和一個 err 。對得到的文件實例調用 close() 方法能夠關閉文件。

為了防止文件忘記關閉,我們通常使用defer注冊文件關閉語句。

Read方法定義如下:

它接收一個字節(jié)切片,返回讀取的字節(jié)數和可能的具體錯誤,讀到文件末尾時會返回 0 和 io.EOF 。 舉個例子:

使用for循環(huán)讀取文件中的所有數據。

bufio是在file的基礎上封裝了一層API,支持更多的功能。

io/ioutil 包的 ReadFile 方法能夠讀取完整的文件,只需要將文件名作為參數傳入。

os.OpenFile() 函數能夠以指定模式打開文件,從而實現文件寫入相關功能。

其中:

name :要打開的文件名 flag :打開文件的模式。 模式有以下幾種:

perm :文件權限,一個八進制數。r(讀)04,w(寫)02,x(執(zhí)行)01。

Go 語言自我提升 (三次握手 - 四次揮手 - TCP狀態(tài)圖 - udp - 網絡文件傳輸)

三次握手:

1. 主動發(fā)起連接請求端(客戶端),發(fā)送 SYN 標志位,攜帶數據包、包號

2. 被動接收連接請求端(服務器),接收 SYN,回復 ACK,攜帶應答序列號。同時,發(fā)送SYN標志位,攜帶數據包、包號

3. 主動發(fā)起連接請求端(客戶端),接收SYN 標志位,回復 ACK。

被動端(服務器)接收 ACK —— 標志著 三次握手建立完成( Accept()/Dial() 返回 )

四次揮手:

1. 主動請求斷開連接端(客戶端), 發(fā)送 FIN標志,攜帶數據包

2. 被動接受斷開連接端(服務器), 發(fā)送 ACK標志,攜帶應答序列號。 —— 半關閉完成。

3. 被動接受斷開連接端(服務器), 發(fā)送 FIN標志,攜帶數據包

4. 主動請求斷開連接端(客戶端), 發(fā)送 最后一個 ACK標志,攜帶應答序列號?!?發(fā)送完成,客戶端不會直接退出,等 2MSL時長。

等 2MSL待目的:確保服務器 收到最后一個ACK

滑動窗口:

通知對端本地存儲數據的 緩沖區(qū)容量。—— write 函數在對端 緩沖區(qū)滿時,有可能阻塞。

TCP狀態(tài)轉換:

1. 主動發(fā)起連接請求端:

CLOSED —— 發(fā)送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回發(fā) ACK —— ESTABLISHED (數據通信)

2. 主動關閉連接請求端:

ESTABLISHED —— 發(fā)送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半關閉、主動端)

—— 接收FIN、回復ACK —— TIME_WAIT (主動端) —— 等 2MSL 時長 —— CLOSED

3. 被動建立連接請求端:

CLOSED —— LISTEN —— 接收SYN、發(fā)送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (數據通信)

4. 被動斷開連接請求端:

ESTABLISHED —— 接收 FIN、發(fā)送 ACK —— CLOSE_WAIT —— 發(fā)送 FIN —— LAST_ACK —— 接收ACK —— CLOSED

windows下查看TCP狀態(tài)轉換:

netstat -an | findstr? 端口號

Linux下查看TCP狀態(tài)轉換:

netstat -an | grep? 端口號

TCP和UDP對比:?

TCP: 面向連接的可靠的數據包傳遞。 針對不穩(wěn)定的 網絡層,完全彌補。ACK

UDP:無連接不可靠的報文傳輸。 針對不穩(wěn)定的 網絡層,完全不彌補。還原網絡真實狀態(tài)。

優(yōu)點???????????????????????????????????????????????????????????? 缺點

TCP: 可靠、順序、穩(wěn)定 ???????????????????????????????????? 系統(tǒng)資源消耗大,程序實現繁復、速度慢

UDP:系統(tǒng)資源消耗小,程序實現簡單、速度快 ???????????????????????? 不可靠、無序、不穩(wěn)定

使用場景:

TCP:大文件、可靠數據傳輸。 對數據的 穩(wěn)定性、準確性、一致性要求較高的場合。

UDP:應用于對數據時效性要求較高的場合。 網絡直播、電話會議、視頻直播、網絡游戲。

UDP-CS-Server實現流程:

1.? 創(chuàng)建 udp地址結構 ResolveUDPAddr(“協(xié)議”, “IP:port”) —— udpAddr 本質 struct{IP、port}

2.? 創(chuàng)建用于 數據通信的 socket ListenUDP(“協(xié)議”, udpAddr ) —— udpConn (socket)

3.? 從客戶端讀取數據,獲取對端的地址 udpConn.ReadFromUDP() —— 返回:n,clientAddr, err

4.? 發(fā)送數據包給 客戶端 udpConn.WriteToUDP("數據", clientAddr)

UDP-CS-Client實現流程:

1.? 創(chuàng)建用于通信的 socket。 net.Dial("udp", "服務器IP:port") —— udpConn (socket)

2.? 以后流程參見 TCP客戶端實現源碼。

UDPserver默認就支持并發(fā)!

------------------------------------

命令行參數: 在main函數啟動時,向整個程序傳參。 【重點】

語法: go run xxx.go ? argv1 argv2? argv3? argv4 。。。

xxx.exe:? 第 0 個參數。

argv1 :第 1 個參數。

argv2 :第 2 個參數。

argv3 :第 3 個參數。

argv4 :第 4 個參數。

使用: list := os.Args? 提取所有命令行參數。

獲取文件屬性函數:

os.stat(文件訪問絕對路徑) —— fileInfo 接口

fileInfo 包含 兩個接口。

Name() 獲取文件名。 不帶訪問路徑

Size() 獲取文件大小。

網絡文件傳輸 —— 發(fā)送端(客戶端)

1.? 獲取命令行參數,得到文件名(帶路徑)filePath list := os.Args

2.? 使用 os.stat() 獲取 文件名(不帶路徑)fileName

3.? 創(chuàng)建 用于數據傳輸的 socket? net.Dial("tcp", “服務器IP+port”) —— conn

4.? 發(fā)送文件名(不帶路徑)? 給接收端, conn.write()

5.? 讀取 接收端回發(fā)“ok”,判斷無誤。封裝函數 sendFile(filePath, conn) 發(fā)送文件內容

6.? 實現 sendFile(filePath,? conn)

1) 只讀打開文件 os.Open(filePath)

for {

2) 從文件中讀數據? f.Read(buf)

3) 將讀到的數據寫到socket中? conn.write(buf[:n])

4)判斷讀取文件的 結尾。 io.EOF. 跳出循環(huán)

}

網絡文件傳輸 —— 接收端(服務器)

1. 創(chuàng)建用于監(jiān)聽的 socket net.Listen() —— listener

2. 借助listener 創(chuàng)建用于 通信的 socket listener.Accpet()? —— conn

3. 讀取 conn.read() 發(fā)送端的 文件名, 保存至本地。

4. 回發(fā) “ok”應答 發(fā)送端。

5. 封裝函數,接收文件內容 recvFile(文件路徑)

1) f = os.Create(帶有路徑的文件名)

for {

2)從 socket中讀取發(fā)送端發(fā)送的 文件內容 。 conn.read(buf)

3)? 將讀到的數據 保存至本地文件 f.Write(buf[:n])

4)? 判斷 讀取conn 結束, 代表文件傳輸完成。 n == 0? break

}

golang如何創(chuàng)建目錄

golang中關于目錄與文件名等操作都在os這個包中,具體的創(chuàng)建目錄都是通過Mkdir和MkdirAll這2個函數來實現的,這兩個函數用法一致

os.Mkdir(dirName?string,?perm?FileMode)

dirName即要創(chuàng)建的目錄(文件夾路徑),可以是絕對路徑,也可以是相對路徑(相對于GOPATH)

perm表示創(chuàng)建的目錄的權限,如0777(讀r權限值為4,寫權限w值為2,執(zhí)行權限x值為1)

如:我要在/data/program/goapp這個目錄下創(chuàng)建一個golang這個子目錄,示例如下:

package?main

import?(

"os"

"fmt"

)

func?main()?{

err?:=?os.Mkdir("/data/program/goapp/golang",?0666)

if?err?!=?nil?{

fmt.Println(err)

}

}

注:Mkdir和MkdirAll的區(qū)別

Mkdir創(chuàng)建目錄,它的父級目錄必須是存在的,不然創(chuàng)建會失敗

MkdirAll可以遞歸創(chuàng)建目錄,即只要根目錄存在即可,如下:

err?:=?os.MkdirAll("/data/program/goapp/golang/test/hello",?0766)

if?err?!=?nil?{

fmt.Println(err)

}

本例中:/data/program/goapp是已經存在的目錄,而子目錄golang/test/hello是不存在,此時要使用MkdirAll來創(chuàng)建

go語言web框架beego安裝(go mod方式)

go語言web框架beego安裝(go mod方式)_不忘初心,方得始終-CSDN博客

重要:將bee命令放到GOROOT/bin目錄下,這步很關鍵

cp bee /usr/local/go/bin/

注:或者可以將GOPATH/bin設置為環(huán)境變量

echo ’export PATH=" PATH"' ~/.bashrc

source ~/.bashrc

router路由下方法名要大寫,訪問權限

wq保存

生效環(huán)境變量: source /etc/profile

go build -o abc.exe可指定編譯后的文件名

Golang常用環(huán)境變量說明與設置詳解

環(huán)境變量GOBIN表示我們開發(fā)程序編譯后二進制命令的安裝目錄。

當我們使用go install命令編譯和打包應用程序時,該命令會將編譯后二進制程序打包GOBIN目錄,一般我們將GOBIN設置為GOPATH/bin目錄。

export GOBIN=$GOPATH/bin

Go get包管理mod

windows下默認項目路徑在go安裝目錄的src下(beego)

golang json:怎么替代yaml:

安裝EasyDataTransform在Mac上就可以解決。

安裝EasyDataTransform在Mac上,開始輕松的數據轉換,將要顯示重復項的Excel電子表格拖到EasyDataTransform上。將添加一個粉紅色的輸入項請注意右側窗格中的JSON數據已自動“展平”到表格中。

您可以將右窗格中的Format下拉菜單設置為Long或Wide,具體取決于您希望表格具有更多行還是更多列,確保選擇了粉紅色的輸入項,單擊左窗格中的ToFile按鈕,將出現一個窗口。設置新文件名和位置。選擇YAML文件作為文件類型。添加并選擇了一個綠色輸出項。YAML文件會立即創(chuàng)建,無需“運行”任何內容您可以在右側窗格中更改YAML文件編碼。

網站欄目:go語言實現修改文件名,go語言文件操作
網站路徑:http://muchs.cn/article6/hsssog.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗網站策劃云服務器、動態(tài)網站、外貿建站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網站建設