真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言中string,Go語(yǔ)言中文網(wǎng)

go語(yǔ)言string之Buffer與Builder

操作字符串離不開字符串的拼接,但是Go中string是只讀類型,大量字符串的拼接會(huì)造成性能問題。

按需網(wǎng)站策劃可以根據(jù)自己的需求進(jìn)行定制,成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)構(gòu)思過程中功能建設(shè)理應(yīng)排到主要部位公司成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)的運(yùn)用實(shí)際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實(shí)際意義

拼接字符串,無外乎四種方式,采用“+”,“fmt.Sprintf()”,"bytes.Buffer","strings.Builder"

上面我們創(chuàng)建10萬字符串拼接的測(cè)試,可以發(fā)現(xiàn)"bytes.Buffer","strings.Builder"的性能最好,約是“+”的1000倍級(jí)別。

這是由于string是不可修改的,所以在使用“+”進(jìn)行拼接字符串,每次都會(huì)產(chǎn)生申請(qǐng)空間,拼接,復(fù)制等操作,數(shù)據(jù)量大的情況下非常消耗資源和性能。而采用Buffer等方式,都是預(yù)先計(jì)算拼接字符串?dāng)?shù)組的總長(zhǎng)度(如果可以知道長(zhǎng)度),申請(qǐng)空間,底層是slice數(shù)組,可以以append的形式向后進(jìn)行追加。最后在轉(zhuǎn)換為字符串。這申請(qǐng)了不斷申請(qǐng)空間的操作,也減少了空間的使用和拷貝的次數(shù),自然性能也高不少。

bytes.buffer是一個(gè)緩沖byte類型的緩沖器存放著都是byte

是一個(gè)變長(zhǎng)的 buffer,具有 Read 和Write 方法。 Buffer 的 零值 是一個(gè) 空的 buffer,但是可以使用,底層就是一個(gè) []byte, 字節(jié)切片。

向Buffer中寫數(shù)據(jù),可以看出Buffer中有個(gè)Grow函數(shù)用于對(duì)切片進(jìn)行擴(kuò)容。

從Buffer中讀取數(shù)據(jù)

strings.Builder的方法和bytes.Buffer的方法的命名幾乎一致。

但實(shí)現(xiàn)并不一致,Builder的Write方法直接將字符拼接slice數(shù)組后。

其沒有提供read方法,但提供了strings.Reader方式

Reader 結(jié)構(gòu):

Buffer:

Builder:

可以看出Buffer和Builder底層都是采用[]byte數(shù)組進(jìn)行裝載數(shù)據(jù)。

先來說說Buffer:

創(chuàng)建好Buffer是一個(gè)empty的,off 用于指向讀寫的尾部。

在寫的時(shí)候,先判斷當(dāng)前寫入字符串長(zhǎng)度是否大于Buffer的容量,如果大于就調(diào)用grow進(jìn)行擴(kuò)容,擴(kuò)容申請(qǐng)的長(zhǎng)度為當(dāng)前寫入字符串的長(zhǎng)度。如果當(dāng)前寫入字符串長(zhǎng)度小于最小字節(jié)長(zhǎng)度64,直接創(chuàng)建64長(zhǎng)度的[]byte數(shù)組。如果申請(qǐng)的長(zhǎng)度小于二分之一總?cè)萘繙p去當(dāng)前字符總長(zhǎng)度,說明存在很大一部分被使用但已讀,可以將未讀的數(shù)據(jù)滑動(dòng)到數(shù)組頭。如果容量不足,擴(kuò)展2*c + n 。

其String()方法就是將字節(jié)數(shù)組強(qiáng)轉(zhuǎn)為string

Builder是如何實(shí)現(xiàn)的。

Builder采用append的方式向字節(jié)數(shù)組后添加字符串。

從上面可以看出,[]byte的內(nèi)存大小也是以倍數(shù)進(jìn)行申請(qǐng)的,初始大小為 0,第一次為大于當(dāng)前申請(qǐng)的最大 2 的指數(shù),不夠進(jìn)行翻倍.

可以看出如果舊容量小于1024進(jìn)行翻倍,否則擴(kuò)展四分之一。(2048 byte 后,申請(qǐng)策略的調(diào)整)。

其次String()方法與Buffer的string方法也有明顯區(qū)別。Buffer的string是一種強(qiáng)轉(zhuǎn),我們知道在強(qiáng)轉(zhuǎn)的時(shí)候是需要進(jìn)行申請(qǐng)空間,并拷貝的。而Builder只是指針的轉(zhuǎn)換。

這里我們解析一下 *(*string)(unsafe.Pointer(b.buf)) 這個(gè)語(yǔ)句的意思。

先來了解下unsafe.Pointer 的用法。

也就是說,unsafe.Pointer 可以轉(zhuǎn)換為任意類型,那么意味著,通過unsafe.Pointer媒介,程序繞過類型系統(tǒng),進(jìn)行地址轉(zhuǎn)換而不是拷貝。

即*A = Pointer = *B

就像上面例子一樣,將字節(jié)數(shù)組轉(zhuǎn)為unsafe.Pointer類型,再轉(zhuǎn)為string類型,s和b中內(nèi)容一樣,修改b,s也變了,說明b和s是同一個(gè)地址。但是對(duì)s重新賦值后,意味著s的地址指向了“WORLD”,它們所使用的內(nèi)存空間不同了,所以s改變后,b并不會(huì)改變。

所以他們的區(qū)別就在于 bytes.Buffer 是重新申請(qǐng)了一塊空間,存放生成的string變量, 而strings.Builder直接將底層的[]byte轉(zhuǎn)換成了string類型返回了回來,去掉了申請(qǐng)空間的操作。

go語(yǔ)言中怎么定義一個(gè)string數(shù)組?

下邊是slice的申明和使用其實(shí)這就是一種動(dòng)態(tài)的數(shù)組復(fù)制代碼 代碼如下:package main

import "fmt"func main() {d := []int{1, 2, 3} //申明一個(gè)slice這個(gè)是動(dòng)態(tài)的數(shù)組,沒有長(zhǎng)fmt.Println(d)

var q, w []intq = d[0:1] //可以定取得上邊的長(zhǎng)度w = d[1:3]d = append(d, 2) //向其中添加元素fmt.Println(d)fmt.Printlnw。

Go語(yǔ)言是谷歌2009年發(fā)布的第二款開源編程語(yǔ)言。Go語(yǔ)言專門針對(duì)多處理器系統(tǒng)應(yīng)用程序的編程進(jìn)行了優(yōu)化,使用Go編譯的程序可以媲美C或C++代碼的速度,而且更加安全、支持并行進(jìn)程。北京時(shí)間2010年1月10日,Go語(yǔ)言摘得了TIOBE公布的2009年年度大獎(jiǎng)。

在谷歌公開發(fā)布的所有網(wǎng)絡(luò)應(yīng)用中,均沒有使用Go,但是谷歌已經(jīng)使用該語(yǔ)言開發(fā)了幾個(gè)內(nèi)部項(xiàng)目。派克表示,Go是否會(huì)對(duì)谷歌即將推出的Chrome OS產(chǎn)生影響,還言之尚早,不過Go的確可以和Native Client配合使用。他表示“Go可以讓應(yīng)用完美的運(yùn)行在瀏覽器內(nèi)?!崩?,使用Go可以更高效的實(shí)現(xiàn)Wave,無論是在前端還是后臺(tái)。

Go 同時(shí)具有兩種編譯器,一種是建立在GCC基礎(chǔ)上的Gccgo,另外一種是分別針對(duì)64位x64和32位x86計(jì)算機(jī)的一套編譯器(6g和8g)。谷歌目前正在研發(fā)其對(duì)ARM芯片和Android設(shè)備的支持。

Google對(duì)Go寄予厚望。其設(shè)計(jì)是讓軟件充分發(fā)揮多核心處理器同步多工的優(yōu)點(diǎn),并可解決面向?qū)ο蟪绦蛟O(shè)計(jì)的麻煩。它具有現(xiàn)代的程序語(yǔ)言特色,如垃圾回收,幫助程序設(shè)計(jì)師處理瑣碎但重要的內(nèi)存管理問題。Go的速度也非???,幾乎和C或C++程序一樣快,且能夠快速制作程序。

Go語(yǔ)言中用下標(biāo)訪問string類型,輸出的是什么編碼

C89/C90標(biāo)準(zhǔn):定義數(shù)組時(shí)下標(biāo)只允許使用整型、字符型常量。引用數(shù)組時(shí)下標(biāo)可以使用整型、字符型的常量或者變量。C99標(biāo)準(zhǔn):定義數(shù)組時(shí)下標(biāo)可以使用整型、字符型的常量或變量,但變量必須已經(jīng)賦值。引用數(shù)組時(shí)下標(biāo)可以使用整型、字符型的常量

數(shù)據(jù)段保存有如下字符串:string byte

string是Go語(yǔ)言中的基礎(chǔ)數(shù)據(jù)類型。

聲明string變量非常簡(jiǎn)單,常見的方式有以下兩種:

聲明一個(gè)空字符串后再賦值。

var s string。

s = "hello world"。

需要注意的是空字符只是長(zhǎng)度為0,但不是nil。不存在值為nil的string。

使用簡(jiǎn)短變量聲明:

s := "hello world" //直接初始化字符串。

雙引號(hào)與單引號(hào)。

字符串不僅可以使用雙引號(hào)賦值,也可以使用反單引號(hào)賦值,它們的區(qū)別是在于對(duì)特殊字符的處理。

假如我們希望string變量表示下面的字符串,它包括換行符和雙引號(hào):

Hi。

this is "Steven"。

1。

2。

使用雙引號(hào)表示時(shí),需要對(duì)特殊字符轉(zhuǎn)義,如下所示:

s:= "Hi, \nthis is \"Steven\"."。

1。

如果使用反單引號(hào)時(shí),不需要對(duì)特殊符號(hào)轉(zhuǎn)義,如下所示:

s := Hi。

this is "Steven"。

需要注意的是,字符串拼接會(huì)觸發(fā)內(nèi)存分配以及內(nèi)存拷貝,單行語(yǔ)句拼接多個(gè)字符串只分配一次內(nèi)存。比如上面的語(yǔ)句中,在拼接時(shí),會(huì)先計(jì)算最終字符串的長(zhǎng)度后再分配內(nèi)存。

類型轉(zhuǎn)換:

項(xiàng)目中,數(shù)據(jù)經(jīng)常需要在string和字節(jié)[]byte之間轉(zhuǎn)換。

go語(yǔ)言中怎么定義一個(gè)string數(shù)組

package main

import "fmt"

var arr [2]int //申明一個(gè)數(shù)組

func main() {

arr[0] = 1 //數(shù)組賦值

fmt.Println(arr)

arrtest := [3]int{1, 2, 3} //數(shù)組的另一種申明方式

fmt.Println(arrtest)

a := [...]int{1, 2} //[...]自動(dòng)識(shí)別數(shù)組的長(zhǎng)度

fmt.Println(a)

fmt.Println(len(a))//輸出數(shù)組的長(zhǎng)度

}

下邊是slice的申明和使用其實(shí)這就是一種動(dòng)態(tài)的數(shù)組

復(fù)制代碼 代碼如下:

package main

import "fmt"

func main() {

d := []int{1, 2, 3} //申明一個(gè)slice這個(gè)是動(dòng)態(tài)的數(shù)組,沒有長(zhǎng)度

fmt.Println(d)

var q, w []int

q = d[0:1] //可以定取得上邊的長(zhǎng)度

w = d[1:3]

d = append(d, 2) //向其中添加元素

fmt.Println(d)

fmt.Println(q, w)

}

go語(yǔ)言中怎樣把string類型轉(zhuǎn)化成int類型

有兩種方法,根據(jù)例子說明: String - ints="12345";int i;第一種方法:i=Integer.parseInt(s);第二種方法:i=Integer.valueOf(s).intValue();第一種方法:i=Integer.parseInt(s);//直接使用靜態(tài)方法,不會(huì)產(chǎn)生多余的對(duì)象,但會(huì)拋出異常第二種.


新聞標(biāo)題:go語(yǔ)言中string,Go語(yǔ)言中文網(wǎng)
分享鏈接:http://weahome.cn/article/hcegsh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部