精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

go語言實現字符串合并 go 字符串比較

go語言string之Buffer與Builder

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

創新互聯是一家集網站建設,磐安企業網站建設,磐安品牌網站建設,網站定制,磐安網站建設報價,網絡營銷,網絡優化,磐安網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。

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

上面我們創建10萬字符串拼接的測試,可以發現"bytes.Buffer","strings.Builder"的性能最好,約是“+”的1000倍級別。

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

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

是一個變長的 buffer,具有 Read 和Write 方法。 Buffer 的 零值 是一個 空的 buffer,但是可以使用,底層就是一個 []byte, 字節切片。

向Buffer中寫數據,可以看出Buffer中有個Grow函數用于對切片進行擴容。

從Buffer中讀取數據

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

但實現并不一致,Builder的Write方法直接將字符拼接slice數組后。

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

Reader 結構:

Buffer:

Builder:

可以看出Buffer和Builder底層都是采用[]byte數組進行裝載數據。

先來說說Buffer:

創建好Buffer是一個empty的,off 用于指向讀寫的尾部。

在寫的時候,先判斷當前寫入字符串長度是否大于Buffer的容量,如果大于就調用grow進行擴容,擴容申請的長度為當前寫入字符串的長度。如果當前寫入字符串長度小于最小字節長度64,直接創建64長度的[]byte數組。如果申請的長度小于二分之一總容量減去當前字符總長度,說明存在很大一部分被使用但已讀,可以將未讀的數據滑動到數組頭。如果容量不足,擴展2*c + n 。

其String()方法就是將字節數組強轉為string

Builder是如何實現的。

Builder采用append的方式向字節數組后添加字符串。

從上面可以看出,[]byte的內存大小也是以倍數進行申請的,初始大小為 0,第一次為大于當前申請的最大 2 的指數,不夠進行翻倍.

可以看出如果舊容量小于1024進行翻倍,否則擴展四分之一。(2048 byte 后,申請策略的調整)。

其次String()方法與Buffer的string方法也有明顯區別。Buffer的string是一種強轉,我們知道在強轉的時候是需要進行申請空間,并拷貝的。而Builder只是指針的轉換。

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

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

也就是說,unsafe.Pointer 可以轉換為任意類型,那么意味著,通過unsafe.Pointer媒介,程序繞過類型系統,進行地址轉換而不是拷貝。

即*A = Pointer = *B

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

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

這個sql語句怎么寫?

無論是在sql 2000,還是在 sql 2005 中,都沒有提供字符串的聚合函數,

所以,當我們在處理下列要求時,會比較麻煩:

有表tb, 如下:

id value

----- ------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

需要得到結果:

id values

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

1 aa,bb

2 aaa,bbb,ccc

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

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

-- 調用函數SELECt id, values=dbo.f_str(id)

FROM tb

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

-- 示例數據

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/*--結果

id values

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

1 aa,bb

2 aaa,bbb,ccc

(2 行受影響)

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

在安裝sql 2005的示例后,默認安裝目錄為

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

無論是在sql 2000,還是在 sql 2005 中,都沒有提供字符串的聚合函數,

所以,當我們在處理下列要求時,會比較麻煩:

有表tb, 如下:

id value

----- ------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

需要得到結果:

id values

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

1 aa,bb

2 aaa,bbb,ccc

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

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

-- 調用函數SELECt id, values=dbo.f_str(id)

FROM tb

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

-- 示例數據

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/*--結果

id values

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

1 aa,bb

2 aaa,bbb,ccc

(2 行受影響)

--*/--各種字符串分函數--3.3.1 使用游標法進行字符串合并處理的示例。

--處理的數據

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--合并處理

--定義結果集表變量

DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定義游標并進行合并處理

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

--顯示結果并刪除測試數據

SELECT * FROM @t

DROP TABLE tb

/*--結果

col1 col2

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

a 1,2

b 1,2,3

--*/

GO

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

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

--處理的數據

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--合并處理函數

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--調用函數

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

--刪除測試

DROP TABLE tb

DROP FUNCTION f_str

/*--結果

col1 col2

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

a 1,2

b 1,2,3

--*/

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

--3.3.3 使用臨時表實現字符串合并處理的示例

--處理的數據

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

/*--更新處理后的臨時表

col1 col2

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

a 1

a 1,2

b 1

b 1,2

b 1,2,3

--*/

--得到最終結果

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

/*--結果

col1 col2

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

a 1,2

b 1,2,3

--*/

--刪除測試

DROP TABLE tb,#t

GO

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

--處理的數據

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

/*--結果

col1 col2

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

a 1,2

b 1,2

c 3

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

--處理的數據

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

/*--結果

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中字符串的遍歷

首先說一下go中的字符串類型:

字符串就是一串固定長度的字符連接起來的字符序列。Go的字符串是由單個字節連接起來的。Go語言的字符串的字節使用UTF-8編碼標識Unicode文本。

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

該遍歷方式==缺點==:遍歷是按照字節遍歷,因此如果有中文等非英文字符,就會出現亂碼,比如要遍歷"abc北京"這個字符串,效果如下:

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

該方式是按照字符遍歷的,所以不會出現亂碼,如下:

運行結果:

從圖中可以看到第二個漢子“京”的開始下標是6,直接跳過了4和5,可見確實依照utf8編碼方式將三個字節組合成了一個漢字,str[3]-str[5]組合成“北”字,str[6]-str[8]組合成了“京”字。

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

1 可以先將字符串轉成 []rune 切片

2 再用常規方法進行遍歷

運行效果:

由此可見下標是按1遞增的,沒有產生跳躍現象。

go語言中字符串怎么跟變量拼接

你是說 goto 標號? 把標號換成變量?

不好這么做,標號到是可以換成自定義的常量,變量不行

你要非用變量

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

話說 goto 還是少用點,多了會亂


當前題目:go語言實現字符串合并 go 字符串比較
分享網址:http://m.jcarcd.cn/article/ddgsghe.html
主站蜘蛛池模板: 成人一级淫妇视频 | 91插插插福利导航 | 最新在线国产麻豆 | 国产精品玖| 日本激情在线网 | 国产激情中文在线 | 国产高清片 | 国产女主播福利资源 | 无码精品人妻一区二区三 | 午夜日韩 | 中文字幕开心激情 | 国产在线精品黄 | 91九色蝌蚪熟女 | 成人推特 | 绿巨人污网站 | 国产精品免费精 | 国产自在现线看 | 91啪国自产中 | 国产/精品 | 成人小视频在 | www.国产精品| 欧美一级淫片 | 国产婬乱视频免费 | 成人一区二区三区 | 欧美最新免费一 | 91视频站 | 欧美性色黄 | 国产美女制服丝 | 国产激情网 | 国内精品国产成 | 日本亲与子 | 国产精品污www| 日韩国产在线播放 | 国产97在线看 | 91拍国 | 日本成人二区 | 九九精品电影 | 精品伊人| 91影视永久福 | 成人动漫一区 | 午夜视频在线观 |