for index,val := range a {
目前成都創(chuàng)新互聯(lián)已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計、延津網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
if val == '好' {
fmt.println(index,x)
}
}
對string做range得到的val是int32類型,直接用單引號比較就行
圖例如下:
結(jié)果應(yīng)該是分別是:
廣度優(yōu)先: a - b - c - d - f - e - g
先序遍歷: a - b - d - e - f - g - c
中序遍歷: e - d - b - g - f - a - c
后序遍歷: e - d - g - f - b - c - a
結(jié)果存在result里面,如果不存可以少一層變量
這個地方強(qiáng)烈建議讀一下下面的第一個鏈接,我遵照著那篇文章實現(xiàn)的,只是用Go改寫了而已。
首先定義一個數(shù)據(jù)結(jié)構(gòu),用來存儲一些Node的信息。
這里是可以運行的,但是總會拋出一個數(shù)組越界的錯誤,我看了半天也沒看出來哪里有問題,Mac版的devel我這邊又有bug,沒用起來。至少思路對了,我后面再看一下哪里的問題。(感謝 @RiXu 指正)
2021-11-10
列表是一種非連續(xù)的存儲容器,有多個節(jié)點組成,節(jié)點通過一些變量記錄彼此之間的關(guān)系
單鏈表和雙鏈表就是列表的兩種方法。
原理:A、B、C三個人,B懂A的電話,C懂B的電話只是單方知道號碼,這樣就形成了一個單鏈表結(jié)構(gòu)。
如果C把自己的號碼給B,B把自己的號碼給A,因為是雙方都知道對方的號碼,這樣就形成了一個雙鏈表結(jié)構(gòu)
如果B換號碼了,他需要通知AC,把自己的號碼刪了,這個過程就是列表的刪除操作。
在Go語言中,列表使用 container/list 包來實現(xiàn),內(nèi)部的實現(xiàn)原理是雙鏈表,列表能夠高效地進(jìn)行任意位置的元素插入和刪除操作。
列表初始化的兩種辦法
列表沒有給出具體的元素類型的限制,所以列表的元素可以是任意類型的,
例如給列表中放入了一個 interface{} 類型的值,取出值后,如果要將 interface{} 轉(zhuǎn)換為其他類型將會發(fā)生宕機(jī)。
雙鏈表支持從隊列前方或后方插入元素,分別對應(yīng)的方法是 PushFront 和 PushBack。
列表插入函數(shù)的返回值會提供一個 *list.Element 結(jié)構(gòu),這個結(jié)構(gòu)記錄著列表元素的值以及與其他節(jié)點之間的關(guān)系等信息,從列表中刪除元素時,需要用到這個結(jié)構(gòu)進(jìn)行快速刪除。
遍歷完也能看到最后的結(jié)果
學(xué)習(xí)地址:
先來看一個簡單的例子
輸出的結(jié)果為:
從上面例子中可以看出,string是以byte數(shù)組形式存儲的,而一個utf8格式的中文占3個byte.要得到正確的中文字符的長度和分割,可以使用 rune 數(shù)組來拆分. rune類型是int32的別名,一個rune可以表示一個中文字符,go也提供了rune數(shù)組自動拆分string中文字符的方法 rt := []rune(str) .
我們再把上面例子修改一下:
得到的輸出結(jié)果為:
這樣就能比較好的處理中文了,而且不會出現(xiàn)亂碼的情況.
#include iostream
#include string.h
using namespace std;
void main()
{
char *p[3] ={"HELLO","5465465","go132HOME"}, str[100];
int i, j, k;
for(i = 0; i 3; i++)
cout p[i] endl;
cout endl;
for(i = 0; i 3; i++)
{
for(k = 0; k 100; k++) str[k] = '\0';
for(k=0;*(p[i]+k);k++)
str[k] = *(p[i]+k);
for(j = 0; str[j]; j++)
{
if(str[j] = 65 str[j] = 90) {str[j] = str[j] + 32;cout str[j];continue;}
if(str[j] = 97 str[j] = 122) {str[j] = str[j] - 32;cout str[j];continue;}
cout str[j];
}
cout endl;
}
}
又:
/*用指針數(shù)組方式定義3個字符串,然后遍歷每個字符串,把里面的小寫字母改大寫,大些字母改小寫。 */
#include iostream
#include string.h
using namespace std;
void main()
{
char *p[3] ={"HELLO","5465465","go132HOME"}, str[100];
int i, j, k;
for(i = 0; i 3; i++)
cout p[i] endl;
cout endl;
for(i = 0; i 3; i++)
{
for(k = 0; k 100; k++) str[k] = '\0';
for(k=0;*(p[i]+k);k++)
str[k] = *(p[i]+k);
for(j = 0; str[j]; j++)
{
if(str[j] = 65 str[j] = 90) {str[j] = str[j] + 32;goto flag;}
if(str[j] = 97 str[j] = 122) {str[j] = str[j] - 32;goto flag;}
flag: cout str[j];
}
cout endl;
}
}
注意:用指針數(shù)組不能直接改
即不能用 *p = *p + 32;
否則出現(xiàn)錯誤: unhandled exception 0xC0000005
對于切片的順序遍歷,一般使用 range 就可以了。
這里有一個問題需要注意一下,如果這里的切片nums不是基本數(shù)據(jù)類型而是結(jié)構(gòu)體。range遍歷出來的value值是拷貝值而并非原結(jié)構(gòu)體,修改value中的值不會改變原切片中的值。如果要遍歷修改,可以將切片的結(jié)構(gòu)體改為指針,或都索引來取值。
一般情況下逆序遍歷思路就是for size-1到0.
二般的也可以使用range來遍歷
當(dāng)前標(biāo)題:go語言字符串遍歷 go 遍歷字符串
URL標(biāo)題:http://muchs.cn/article42/hhephc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、用戶體驗、移動網(wǎng)站建設(shè)、定制網(wǎng)站、、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)