欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語言字節(jié)處理函數(shù) go 字符串函數(shù)

Go語言文件操作

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

創(chuàng)新互聯(lián)公司是專業(yè)的調(diào)兵山網(wǎng)站建設(shè)公司,調(diào)兵山接單;提供網(wǎng)站建設(shè)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行調(diào)兵山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

文件是什么?

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

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

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

Read方法定義如下:

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

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

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

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

os.OpenFile() 函數(shù)能夠以指定模式打開文件,從而實(shí)現(xiàn)文件寫入相關(guān)功能。

其中:

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

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

如何將任意Golang接口轉(zhuǎn)換為字節(jié)數(shù)組

golang語言本身就是c的工具集,開發(fā)c的程序用到的大部分結(jié)構(gòu)體,內(nèi)存管理,攜程等,golang基本都有,他只是在這個基礎(chǔ)上又加了一些概念這里說一個很小的問題,就是字節(jié)數(shù)組轉(zhuǎn)string的問題,網(wǎng)上大部分都是這樣轉(zhuǎn)的(包括google上):string(p[:]),這個轉(zhuǎn)完了是有問題的,我們再來看一下string這個結(jié)構(gòu)體:

struct String

{

byte* str;

intgo len;

};

這個結(jié)構(gòu)體讓我想起了nginx的string,他是這樣定義的:

typedef struct {

size_t len;

u_char *data;

} ngx_str_t;

golang里邊 string的概念其實(shí)不是以前遇到\0結(jié)尾的概念了,他其實(shí)就是一塊連續(xù)的內(nèi)存,首地址+長度,上面那樣賦值,如果p里邊有\(zhòng)0,他不會做處理這個時候,如果再對這個string做其他處理就可能出問題了,比如strconv.Atoi轉(zhuǎn)成int就有錯誤,解決辦法就是需要自己寫一個正規(guī)的轉(zhuǎn)換函數(shù):

func byteString(p []byte) string {

for i := 0; i len(p); i++ {

if p[i] == 0 {

return string(p[0:i])

}

}

return string(p)

}

這樣就不會出問題了

GO語言學(xué)習(xí)系列八——GO函數(shù)(func)的聲明與使用

GO是編譯性語言,所以函數(shù)的順序是無關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫在最前面,其余函數(shù)按照功能需要進(jìn)行排列

GO的函數(shù) 不支持嵌套,重載和默認(rèn)參數(shù)

GO的函數(shù) 支持 無需聲明變量,可變長度,多返回值,匿名,閉包等

GO的函數(shù)用 func 來聲明,且左大括號 { 不能另起一行

一個簡單的示例:

輸出為:

參數(shù):可以傳0個或多個值來供自己用

返回:通過用 return 來進(jìn)行返回

輸出為:

上面就是一個典型的多參數(shù)傳遞與多返回值

對例子的說明:

按值傳遞:是對某個變量進(jìn)行復(fù)制,不能更改原變量的值

引用傳遞:相當(dāng)于按指針傳遞,可以同時改變原來的值,并且消耗的內(nèi)存會更少,只有4或8個字節(jié)的消耗

在上例中,返回值 (d int, e int, f int) { 是進(jìn)行了命名,如果不想命名可以寫成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:

當(dāng)返回了多個值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來補(bǔ)位,例如上例的返回我們可以寫成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來舍棄掉

在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個可變長度的參數(shù)

輸出為:

在上例中, strs ...string 中, strs 的實(shí)際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的參數(shù)的例子,更多一些演變的形式,都非常類似

在GO中 defer 關(guān)鍵字非常重要,相當(dāng)于面相對像中的析構(gòu)函數(shù),也就是在某個函數(shù)執(zhí)行完成后,GO會自動這個;

如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進(jìn)后出;

當(dāng)某個函數(shù)出現(xiàn)嚴(yán)重錯誤時, defer 也會被調(diào)用

輸出為

這是一個最簡單的測試了,當(dāng)然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時,判斷是哪個函數(shù)出了問題,完全可以根據(jù) defer 打印出來的內(nèi)容來進(jìn)行判斷,非常快速,這種留給你們?nèi)?shí)現(xiàn)

一個函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱之為遞歸函數(shù),在做遞歸調(diào)用時,經(jīng)常會將內(nèi)存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用

本篇重點(diǎn)介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct

Go語言 排序與搜索切片

Go語言標(biāo)準(zhǔn)庫中提供了sort包對整型,浮點(diǎn)型,字符串型切片進(jìn)行排序,檢查一個切片是否排好序,使用二分法搜索函數(shù)在一個有序切片中搜索一個元素等功能。

關(guān)于sort包內(nèi)的函數(shù)說明與使用,請查看

在這里簡單講幾個sort包中常用的函數(shù)

在Go語言中,對字符串的排序都是按照字節(jié)排序,也就是說在對字符串排序時是區(qū)分大小寫的。

二分搜索算法

Go語言中提供了一個使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比較㏒?n個元素,其中n為切片中元素的總數(shù)。

sort.Search(size,fn)函數(shù)接受兩個參數(shù):所處理的切片的長度和一個將目標(biāo)元素與有序切片的元素相比較的函數(shù),該函數(shù)是一個閉包,如果該有序切片是升序排列,那么在判斷時使用 有序切片的元素 = 目標(biāo)元素。該函數(shù)返回一個int值,表示與目標(biāo)元素相同的切片元素的索引。

在切片中查找出某個與目標(biāo)字符串相同的元素索引

Go語言中的字節(jié)序

Go中的binary包實(shí)現(xiàn)了簡單的數(shù)字與字節(jié)序列的轉(zhuǎn)換以及變長值的編解碼

package main

import ( "fmt" "bytes" "encoding/binary" ) func main(){ n := 0x12345678 bytesBuffer := bytes.NewBuffer([]byte{}) //BigEndian 大端順序存儲 LittleEndian小端順序存儲 binary.Write(bytesBuffer, binary.BigEndian, int32(n)) data:=bytesBuffer.Bytes() fmt.Printf("[0]: %#x addr:%#x\n",data[0],data[0]) fmt.Printf("[0]: %#x addr:%#x\n",data[1],data[1]) fmt.Printf("[0]: %#x addr:%#x\n",data[2],data[2]) fmt.Printf("[0]: %#x addr:%#x\n",data[3],data[3]) }

輸出

[0]: 0x12 addr:0xc042010248 [1]: 0x34 addr:0xc042010249 [2]: 0x56 addr:0xc04201024a [3]: 0x78 addr:0xc04201024b

也可以使用下面的方式

n := 0x12345678 var data []byte = make([]byte,4) //操作的都是無符號整型 binary.BigEndian.PutUint32(data,uint32(n))

可以使用下面的方式判斷當(dāng)前系統(tǒng)的字節(jié)序類型

const INT_SIZE int = int(unsafe.Sizeof(0))

//判斷我們系統(tǒng)中的字節(jié)序類型 func systemEdian() { var i int = 0x1 bs := (*[INT_SIZE]byte)(unsafe.Pointer(i)) if bs[0] == 0 { fmt.Println("system edian is little endian") } else { fmt.Println("system edian is big endian") } }

名稱欄目:go語言字節(jié)處理函數(shù) go 字符串函數(shù)
本文路徑:http://chinadenli.net/article22/doojhjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)用戶體驗(yàn)動態(tài)網(wǎng)站微信公眾號全網(wǎng)營銷推廣移動網(wǎng)站建設(shè)

廣告

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

網(wǎng)站托管運(yùn)營