初探Golang(4)-map和流程控制語句

1.map

map 是引用類型的,如果聲明沒有初始化值,默認是nil。空的切片是可以直接使用的,因為他有對應的底層數組,空的map不能直接使用。需要先make之后才能使用。

//1, 聲明map 默認值是nil
var m1 map[key_data_type]value_data_type
聲明  變量名稱 map[key的數據類型]value的數據類型
//2,使用make聲明
m2:=make(map[key_data_type]value_data_type)
//3,直接聲明并初始化賦值map方法
m3:=map[string]int{"語文":89,"數學":23,"英語":90}

1.1 map 使用

  • 插入以及更新語法:map[key]=value
  • 刪除map中key對應的鍵值對數據 語法: delete(map, key)
  • 訪問語法 map[key]
//遍歷map
for key, val := range map1 {fmt.Println(key, val)
}

1.2 map底層原理

源代碼解析

struct Hmap
{
uint8 B; // 可以容納2^B個項
uint16 bucketsize; // 每個桶的大小
byte *buckets; // 2^B個Buckets的數組
byte *oldbuckets; // 前一個buckets,只有當正在擴容時才不為空
};struct Bucket
{
uint8 tophash[BUCKETSIZE]; // hash值的高8位....低位從bucket的array定位到bucket
Bucket *overflow; // 溢出桶鏈表,如果有
byte data[1]; // BUCKETSIZE keys followed by BUCKETSIZE values
};
// BUCKETSIZE是用宏定義的8,每個bucket中存放最多8個key/value對, 如果多于8個,那么會申請一個新的bucket,overflow指向它
  • Bucket中key/value的放置順序,是將keys放在一起,values放在一起。
  • 擴容使用的是增量擴容:擴容會建立一個大小是原來2倍的新的表,將舊的bucket搬到新的表中之后,并不會將舊的bucket從oldbucket中刪除,而是加上一個已刪除的標記。當hash表擴容之后,需要將那些舊的pair重新哈希到新的table上,這個工作是逐步的完成(在insert和remove時每次搬移1-2個pair)

查找過程

  1. 根據key計算出hash值。
  2. 如果存在old table, 首先在old table中查找,如果找到的bucket已經evacuated,轉到步驟3。 反之,返回其對應的value。
  3. 在new table中查找對應的value。
    插入過程分析
  4. 根據key算出hash值,進而得出對應的bucket。
  5. 如果bucket在old table中,將其重新散列到new table中。
  6. 在bucket中,查找空閑的位置,如果已經存在需要插入的key,更新其對應的value。
  7. 根據table中元素的個數,判斷是否grow table。
  8. 如果對應的bucket已經full,重新申請新的bucket作為overbucket。
    將key/value pair插入到bucket中。

2.流程控制

  • 我們的程序的執行正常是由上到下逐行執行,叫做 順序結構 。
  • 程序中為了滿足某種條件的時候才會執行的結構,叫做選擇結構(if、 switch)。
  • 當滿足條件時候循環反復執行多次的代碼, 叫做 循環結構(for)

2.1 if語句

if 布爾表達式{//布爾條件為true時候執行代碼
}if 布爾表達式 {//條件成立執行代碼
}else{//條件不成立執行代碼
}if 布爾表達式 {//布爾條件為true時候執行代碼
}else if 布爾表達式2{//布爾條件為flase時候執行代碼
}else{//上面都不成立執行代碼
}

特殊寫法:Go語言中可以在if之后,條件判斷之間再加上一段執行語句,執行的結果再用作后面的條件判斷。(先執行語句,再判斷條件)

if a :=1; a==1
{}

2.2 switch分支語句

if 中判斷條件只能為bool類型,但是switch中條件可以為其他類型,case的值必須是唯一的,因為只能進入一個case語句塊。

switch 中 break 和fallthrough
break 直接跳出整個switch語句塊
fallthrough 當前case執行完了,繼續執行下面的case

2.3 for 循環語句

語法: for init; condition;post{ }
init            初始化  只執行一次
condition   bool類型 執行條件 如果滿足繼續執行后面的循環體  如果不滿足 則終止執行
{}               循環體
post           表達式 將在循環體執行結束之后執行

break:跳出當前循環,如果后面break后面帶標簽,則跳到標簽處

continue: 中止當前循環,進入下一循環

goto: 和break加標簽用法一樣

3. 值傳遞與引用傳遞

golang中的變量可以分為以下兩種類型

  • 值類型:int、float、string、bool、array、struct
  • 引用類型: slice、pointer、map、chan 等
    值類型傳遞的是數值本身,被修改不會影響原來的值。
    引用類型傳遞的是內存地址,被修改時會影響原來的值。

4. 深拷貝和淺拷貝

淺拷貝復制過來的是內存地址,操作的是同一對象,但是深拷貝是新建一個對象,并且將源對象的內容通通復制一份。
使用深拷貝數據函數: copy(目標切片,數據源)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391243.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡傳輸之TCP/IP協議族

我們現實網絡無處不在,我們被龐大的虛擬網絡包圍,但我們卻對它是怎樣把我們的信息傳遞并實現通信的,我們并沒有了解過,那么當我們在瀏覽器中出入一段地址,按下回車這背后都會發生什么? 比如說一般場景下&am…

(58)PHP開發

LAMP0、使用include和require命令來包含外部PHP文件。使用include_once命令,但是include和include_once命令相比的不足就是這兩個命令并不關心請求的文件是否實際存在,如果不存在,PHP解釋器就會直接忽略這個命令并且顯示一個錯誤消息&#xf…

css flexbox模型_如何將Flexbox后備添加到CSS網格

css flexbox模型I shared how to build a calendar with CSS Grid in the previous article. Today, I want to share how to build a Flexbox fallback for the same calendar. 在上一篇文章中,我分享了如何使用CSS Grid構建日歷。 今天,我想分享如何為…

python:封裝連接數據庫方法

config.py # 數據庫測試環境 name *** password ****** host_port_sid 10.**.*.**:1521/bidbuat OracleOperation.py import cx_Oracle import configclass OracleOperation(object):# 執行下面的execute_sql方法時會自動執行該初始化方法進行連接數據庫def __init__(self):…

貝塞爾修正_貝塞爾修正背后的推理:n-1

貝塞爾修正A standard deviation seems like a simple enough concept. It’s a measure of dispersion of data, and is the root of the summed differences between the mean and its data points, divided by the number of data points…minus one to correct for bias.標…

RESET MASTER和RESET SLAVE使用場景和說明【轉】

【前言】在配置主從的時候經常會用到這兩個語句,剛開始的時候還不清楚這兩個語句的使用特性和使用場景。 經過測試整理了以下文檔,希望能對大家有所幫助; 【一】RESET MASTER參數 功能說明:刪除所有的binglog日志文件,…

Kubernetes 入門(1)基本概念

1. Kubernetes簡介 作為一個目前在生產環境已經廣泛使用的開源項目 Kubernetes 被定義成一個用于自動化部署、擴容和管理容器應用的開源系統;它將一個分布式軟件的一組容器打包成一個個更容易管理和發現的邏輯單元。 Kubernetes 是希臘語『舵手』的意思&#xff0…

Python程序互斥體

Python程序互斥體 有時候我們需要程序只運行一個實例,在windows平臺下我們可以很簡單的用mutex實現這個目的。 ??在開始時,程序創建了一個命名的mutex,這個mutex可以被其他進程檢測到。 這樣如果程序已經啟動,再次運行時的進程就…

890

890 轉載于:https://www.cnblogs.com/Forever77/p/11528605.html

android 西班牙_分析西班牙足球聯賽(西甲)

android 西班牙The Spanish football league commonly known as La Liga is the first national football league in Spain, being one of the most popular professional sports leagues in the world. It was founded in 1929 and has been held every year since then with …

Goalng軟件包推薦

2019獨角獸企業重金招聘Python工程師標準>>> 前言 哈嘍大家好呀! 馬上要迎來狗年了大家是不是已經懷著過年的心情了呢? 今天筆者給大家帶來了一份禮物, Goalng的軟件包推薦, 主要總結了一下在go語言中大家開源的優秀的軟件, 大家了解之后在后續使用過程有遇到如下軟…

Kubernetes 入門(2)基本組件

1. C/S架構 Kubernetes 遵循非常傳統的客戶端服務端架構,客戶端通過 RESTful 接口或者直接使用 kubectl 與 Kubernetes 集群進行通信,這兩者在實際上并沒有太多的區別,后者也只是對 Kubernetes 提供的 RESTful API 進行封裝并提供出來。 左側…

caioj1522: [NOIP提高組2005]過河

狀態壓縮的經典題。 按照一般做法,DP一維時間O(n),顯然跑不過。考慮到石子較少,實際上有很長一段是一定可以跳到的,設兩個石頭分別在i點和j點,跳躍的路程為S到T。那么從i點可以跳到iS到iT。從j-T到j-S可以跳到J。顯然當…

Dev控件使用CheckedListBoxControl獲取items.count為0 的解決方法

CheckedListBoxControl,我使用DataSource屬性,給其綁定了一個List對象。界面顯示都挺正常的,當若干個項的復選框被選中的后,它的checkedListBoxControl1.CheckedItems也是正常的。 唯獨的問題是在代碼中得到的checkedListBoxContr…

如何啟動軟件YouTube頻道

Hi, I’m Beau and I run the freeCodeCamp.org YouTube channel. 嗨,我是Beau,我運行了freeCodeCamp.org YouTube頻道 。 For the first few years of our channel’s life, we had less than 100,000 subscribers. When we published new videos, we …

【powerdesign】從mysql數據庫導出到powerdesign,生成數據字典

使用版本powerdesign16.5,mysql 5.5,windows 64 步驟: 1.下載mysql驅動【注意 32和64的驅動都下載下來,具體原因查看第三步 依舊會報錯處】 下載地址:https://dev.mysql.com/downloads/connector/odbc/5.3.html 請下…

php amazon-s3_推薦亞馬遜電影-一種協作方法

php amazon-s3Item-based collaborative and User-based collaborative approach for recommendation system with simple coding.推薦系統的基于項目的協作和基于用戶的協作方法,編碼簡單。 推薦系統概述 (Overview of Recommendation System) There are many met…

[高精度乘法]BZOJ 1754 [Usaco2005 qua]Bull Math

模板題目&#xff0c;練練手~ #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std;int s1[2333]; int s2[2333]; int Out[2333]; string one,two;void Debug(){for(int i0;i<one.length();i){pri…

python:使用Djangorestframework編寫post和get接口

1、安裝django pip install django 2、新建一個django工程 python manage.py startproject cainiao_monitor_api 3、新建一個app python manage.py startapp monitor 4、安裝DRF pip install djangorestframework 5、編寫視圖函數 views.py from rest_framework.views import A…

Kubernetes 入門(3)集群安裝

1. kubeadm簡介 kubeadm 是 Kubernetes 官方提供的一個 CLI 工具&#xff0c;可以很方便的搭建一套符合官方最佳實踐的最小化可用集群。當我們使用 kubeadm 搭建集群時&#xff0c;集群可以通過 K8S 的一致性測試&#xff0c;并且 kubeadm 還支持其他的集群生命周期功能&#…