一般情況下我們對於陣列、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...