對於golang,for range的乙個誤解

2021-10-07 17:11:59 字數 856 閱讀 3174

一般情況下我們對於陣列、slice、map和channel等型別可能會用到for…range進行遍歷。寫法通常如下。

buf :=

intfor k, v :=

range buf

我之前一度認為在每次迴圈遍歷的時候都會在棧上建立k,v兩個變數。以至於在**中我更偏向於用for迴圈去實現乙個陣列的遍歷。但其實並不是這樣,k、v兩個變數只建立一次。可以通過下面一段**來進行驗證。

buf :=

intfor k, v :=

range buf

輸出為

0xc042064080 0xc042064088

0xc042064080 0xc042064088

0xc042064080 0xc042064088

k和v兩個變數的位址從始至終是沒有改變的。

這裡還可能遇到乙個經常出現的面試問題,如下。

// 請問下面這段**的輸出

m :=

make

(map

[int]*

int)

buf :=

intfor k, v :=

range buf

for k, v :=

range m

如果理解了上面指標的概念就可以得出,所有的value存的都是同乙個指標,而這個指標在遍歷slice時最後被設定為3,所以輸出應該為

0 3

1 32 3

當然,這個輸出可能是亂序的,因為map是乙個hash儲存,並不是單純按照index的大小來進行排序的。

對於物件查詢

結論 對於物件查詢 1 使用list的時候會將物件全部取出,而使用iterate則只先將物件主鍵取出,然後在使用的時候再乙個個取出。2 list第二使用的時候會繼續重新資料庫中取出,而iterate則會先成快取中查詢,如果沒找到再去資料庫中取出。對於屬性查詢 條件 查詢快取關閉 兩者沒什麼差別,根據...

對於物件查詢

對於物件查詢 1 使用list的時候會將物件全部取出,而使用iterate則只先將物件主鍵取出,然後在使用的時候再乙個個取出。2 list第二使用的時候會繼續重新資料庫中取出,而iterate則會先成快取中查詢,如果沒找到再去資料庫中取出。對於屬性查詢 條件 查詢快取關閉 兩者沒什麼差別,根據查詢物...

對於order by子句

order by子句指定排序順序 select username from user order by username 依據username的字母順序對於查詢出來的username進行排序,預設是公升序 a z 也可以進行降序排序,必須指定desc關鍵字 在上面的sql語句變為 select us...