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

go語(yǔ)言實(shí)現(xiàn)字符串合并 go 字符串比較

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

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

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),磐安企業(yè)網(wǎng)站建設(shè),磐安品牌網(wǎng)站建設(shè),網(wǎng)站定制,磐安網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,磐安網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

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

上面我們創(chuàng)建10萬(wàn)字符串拼接的測(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ù)組后。

其沒(méi)有提供read方法,但提供了strings.Reader方式

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

Buffer:

Builder:

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

先來(lái)說(shuō)說(shuō)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)度,說(shuō)明存在很大一部分被使用但已讀,可以將未讀的數(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ǔ)句的意思。

先來(lái)了解下unsafe.Pointer 的用法。

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

即*A = Pointer = *B

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

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

這個(gè)sql語(yǔ)句怎么寫?

無(wú)論是在sql 2000,還是在 sql 2005 中,都沒(méi)有提供字符串的聚合函數(shù),

所以,當(dāng)我們?cè)谔幚硐铝幸髸r(shí),會(huì)比較麻煩:

有表tb, 如下:

id value

----- ------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

需要得到結(jié)果:

id values

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

1 aa,bb

2 aaa,bbb,ccc

即, group by id, 求 value 的和(字符串相加)1. 舊的解決方法-- 1. 創(chuàng)建處理函數(shù)

CREATE FUNCTION dbo.f_str(@id int)

RETURNS varchar(8000)

AS

BEGIN

DECLARE @r varchar(8000)

SET @r = ''

SELECT @r = @r + ',' + value

FROM tb

WHERE id=@id

RETURN STUFF(@r, 1, 1, '')

END

GO

-- 調(diào)用函數(shù)SELECt id, values=dbo.f_str(id)

FROM tb

GROUP BY id-- 2. 新的解決方法

-- 示例數(shù)據(jù)

DECLARE @t TABLE(id int, value varchar(10))

INSERT @t SELECT 1, 'aa'

UNION ALL SELECT 1, 'bb'

UNION ALL SELECT 2, 'aaa'

UNION ALL SELECT 2, 'bbb'

UNION ALL SELECT 2, 'ccc'-- 查詢處理

SELECT *

FROM(

SELECT DISTINCT

id

FROM @t

)A

OUTER APPLY(

SELECT

[values]= STUFF(REPLACE(REPLACE(

(

SELECT value FROM @t N

WHERE id = A.id

FOR XML AUTO

), 'N value="', ','), '"/', ''), 1, 1, '')

)N/*--結(jié)果

id values

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

1 aa,bb

2 aaa,bbb,ccc

(2 行受影響)

--*/CSDN 社區(qū)帖子地址 附: 合并與分拆的CLR, sql2005的示例中有:

在安裝sql 2005的示例后,默認(rèn)安裝目錄為

drive:\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中SQL code問(wèn)題描述:

無(wú)論是在sql 2000,還是在 sql 2005 中,都沒(méi)有提供字符串的聚合函數(shù),

所以,當(dāng)我們?cè)谔幚硐铝幸髸r(shí),會(huì)比較麻煩:

有表tb, 如下:

id value

----- ------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

需要得到結(jié)果:

id values

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

1 aa,bb

2 aaa,bbb,ccc

即, group by id, 求 value 的和(字符串相加)1. 舊的解決方法-- 1. 創(chuàng)建處理函數(shù)

CREATE FUNCTION dbo.f_str(@id int)

RETURNS varchar(8000)

AS

BEGIN

DECLARE @r varchar(8000)

SET @r = ''

SELECT @r = @r + ',' + value

FROM tb

WHERE id=@id

RETURN STUFF(@r, 1, 1, '')

END

GO

-- 調(diào)用函數(shù)SELECt id, values=dbo.f_str(id)

FROM tb

GROUP BY id-- 2. 新的解決方法

-- 示例數(shù)據(jù)

DECLARE @t TABLE(id int, value varchar(10))

INSERT @t SELECT 1, 'aa'

UNION ALL SELECT 1, 'bb'

UNION ALL SELECT 2, 'aaa'

UNION ALL SELECT 2, 'bbb'

UNION ALL SELECT 2, 'ccc'-- 查詢處理

SELECT *

FROM(

SELECT DISTINCT

id

FROM @t

)A

OUTER APPLY(

SELECT

[values]= STUFF(REPLACE(REPLACE(

(

SELECT value FROM @t N

WHERE id = A.id

FOR XML AUTO

), 'N value="', ','), '"/', ''), 1, 1, '')

)N/*--結(jié)果

id values

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

1 aa,bb

2 aaa,bbb,ccc

(2 行受影響)

--*/--各種字符串分函數(shù)--3.3.1 使用游標(biāo)法進(jìn)行字符串合并處理的示例。

--處理的數(shù)據(jù)

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3--合并處理

--定義結(jié)果集表變量

DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定義游標(biāo)并進(jìn)行合并處理

DECLARE tb CURSOR LOCAL

FOR

SELECT col1,col2 FROM tb ORDER BY col1,col2

DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)

OPEN tb

FETCH tb INTO @col1,@col2

SELECT @col1_old=@col1,@s=''

WHILE @@FETCH_STATUS=0

BEGIN

IF @col1=@col1_old

SELECT @s=@s+','+CAST(@col2 as varchar)

ELSE

BEGIN

INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))

SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1

END

FETCH tb INTO @col1,@col2

END

INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))

CLOSE tb

DEALLOCATE tb

--顯示結(jié)果并刪除測(cè)試數(shù)據(jù)

SELECT * FROM @t

DROP TABLE tb

/*--結(jié)果

col1 col2

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

a 1,2

b 1,2,3

--*/

GO

/*==============================================*/

--3.3.2 使用用戶定義函數(shù),配合SELECT處理完成字符串合并處理的示例

--處理的數(shù)據(jù)

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3

GO--合并處理函數(shù)

CREATE FUNCTION dbo.f_str(@col1 varchar(10))

RETURNS varchar(100)

AS

BEGIN

DECLARE @re varchar(100)

SET @re=''

SELECT @re=@re+','+CAST(col2 as varchar)

FROM tb

WHERE col1=@col1

RETURN(STUFF(@re,1,1,''))

END

GO--調(diào)用函數(shù)

SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1

--刪除測(cè)試

DROP TABLE tb

DROP FUNCTION f_str

/*--結(jié)果

col1 col2

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

a 1,2

b 1,2,3

--*/

GO/*==============================================*/

--3.3.3 使用臨時(shí)表實(shí)現(xiàn)字符串合并處理的示例

--處理的數(shù)據(jù)

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3--合并處理

SELECT col1,col2=CAST(col2 as varchar(100))

INTO #t FROM tb

ORDER BY col1,col2

DECLARE @col1 varchar(10),@col2 varchar(100)

UPDATE #t SET

@col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,

@col1=col1,

col2=@col2

SELECT * FROM #t

/*--更新處理后的臨時(shí)表

col1 col2

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

a 1

a 1,2

b 1

b 1,2

b 1,2,3

--*/

--得到最終結(jié)果

SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1

/*--結(jié)果

col1 col2

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

a 1,2

b 1,2,3

--*/

--刪除測(cè)試

DROP TABLE tb,#t

GO

/*==============================================*/--3.3.4.1 每組 =2 條記錄的合并

--處理的數(shù)據(jù)

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'c',3--合并處理

SELECT col1,

col2=CAST(MIN(col2) as varchar)

+CASE

WHEN COUNT(*)=1 THEN ''

ELSE ','+CAST(MAX(col2) as varchar)

END

FROM tb

GROUP BY col1

DROP TABLE tb

/*--結(jié)果

col1 col2

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

a 1,2

b 1,2

c 3

--*/--3.3.4.2 每組 =3 條記錄的合并

--處理的數(shù)據(jù)

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3

UNION ALL SELECT 'c',3--合并處理

SELECT col1,

col2=CAST(MIN(col2) as varchar)

+CASE

WHEN COUNT(*)=3 THEN ','

+CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)

ELSE ''

END

+CASE

WHEN COUNT(*)=2 THEN ','+CAST(MAX(col2) as varchar)

ELSE ''

END

FROM tb a

GROUP BY col1

DROP TABLE tb

/*--結(jié)果

col1 col2

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

a 1,2

b 1,2,3

c 3

--*/

GO

if not object_id('A') is null

drop table A

Go

Create table A([id] int,[cname] nvarchar(2))

Insert A

select 1,N'張三' union all

select 2,N'李四' union all

select 3,N'王五' union all

select 4,N'蔡六'

Go

-- -- if not object_id('B') is null

drop table B

Go

Create table B([id] int,[cname] nvarchar(5))

Insert B

select 1,N'1,2,3' union all

select 2,N'3,4'

Go

create function F_str(@cname nvarchar(100))

returns nvarchar(100)

as

begin

select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')0

return @cname

end

go

select [id],dbo.F_str([cname])[cname] from Bid cname

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

1 張三,李四,王五

2 王五,蔡六

Go中字符串的遍歷

首先說(shuō)一下go中的字符串類型:

字符串就是一串固定長(zhǎng)度的字符連接起來(lái)的字符序列。Go的字符串是由單個(gè)字節(jié)連接起來(lái)的。Go語(yǔ)言的字符串的字節(jié)使用UTF-8編碼標(biāo)識(shí)Unicode文本。

下面介紹字符串的三種遍歷方式,根據(jù)實(shí)際情況選擇即可。

該遍歷方式==缺點(diǎn)==:遍歷是按照字節(jié)遍歷,因此如果有中文等非英文字符,就會(huì)出現(xiàn)亂碼,比如要遍歷"abc北京"這個(gè)字符串,效果如下:

可見(jiàn)這不是我們想要的效果,根據(jù)utf-8中文編碼規(guī)則,我們要str[3]str[4]str[5]三個(gè)字節(jié)合起來(lái)組成“北”字及 str[6]str[7]str[8]合起來(lái)組成“京”字。由此引出下面第二種遍歷方法。

該方式是按照字符遍歷的,所以不會(huì)出現(xiàn)亂碼,如下:

運(yùn)行結(jié)果:

從圖中可以看到第二個(gè)漢子“京”的開(kāi)始下標(biāo)是6,直接跳過(guò)了4和5,可見(jiàn)確實(shí)依照utf8編碼方式將三個(gè)字節(jié)組合成了一個(gè)漢字,str[3]-str[5]組合成“北”字,str[6]-str[8]組合成了“京”字。

由于下標(biāo)的不確定性,所以引出了下面的遍歷方式。

1 可以先將字符串轉(zhuǎn)成 []rune 切片

2 再用常規(guī)方法進(jìn)行遍歷

運(yùn)行效果:

由此可見(jiàn)下標(biāo)是按1遞增的,沒(méi)有產(chǎn)生跳躍現(xiàn)象。

go語(yǔ)言中字符串怎么跟變量拼接

你是說(shuō) goto 標(biāo)號(hào)? 把標(biāo)號(hào)換成變量?

不好這么做,標(biāo)號(hào)到是可以換成自定義的常量,變量不行

你要非用變量

直接寫判斷if,然后執(zhí)行不同的goto不就好了么

話說(shuō) goto 還是少用點(diǎn),多了會(huì)亂

網(wǎng)頁(yè)標(biāo)題:go語(yǔ)言實(shí)現(xiàn)字符串合并 go 字符串比較
分享路徑:http://chinadenli.net/article44/ddgsghe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)網(wǎng)站收錄域名注冊(cè)網(wǎng)站設(shè)計(jì)網(wǎng)站設(shè)計(jì)公司微信小程序

廣告

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

微信小程序開(kāi)發(fā)