Golang函數make介紹和用法

1.介紹

golang分配內存主要有內置函數newmake

相同點:

  • 他們的第一個參數都是一個類型而不是一個值

不同點:

  • new可分配任意類型的數據
  • make只能為slice, map, channel分配內存
  • new返回的是指針
  • make返回類型的是引用不是指針,并且返回的值也依賴于具體傳入的類型,

這種不同點的原因是:這三種類型(slice, map, channel)的數據結構必須在使用前初始化

func make(t Type,size IntegerType) Typemake(Type, len, cap)
  • Type:數據類型,必要參數,Type 的值只能是 slice、 map、 channel 這三種數據類型。
  • len:數據類型實際占用的內存空間長度,map、 channel 是可選參數,slice 是必要參數。
  • cap:為數據類型提前預留的內存空間長度,可選參數,所謂的提前預留是當前為數據類型申請內存空間的時候,提前申請好額外的內存空間,這樣可以避免二次分配內存帶來的開銷,大大提高程序的性能

2.用法

  • make(map[string]string)
    • 缺少長度的參數,只傳類型,這種用法只能用在類型為map或chan的場景,例如make([]int)是會報錯的。這樣返回的空間長度都是默認為0的
  • make([]int, 2)
    • 指定了長度,例如make([]int, 2)返回的是一個長度為2的slice
  • make([]int, 2, 4)
    • 第二參數指定的是切片的長度,第三個參數是用來指定預留的空間長度,例如a := make([]int, 2, 4), 這里值得注意的是返回的切片a的總長度是4,預留的意思并不是另外多出來4的長度,其實是包含了前面2個已經切片的個數的。所以舉個例子當你這樣用的時候 a := make([]int, 4, 2),就會報語法錯誤

思考一個問題:為什么要指定預留的大小呢?

????????這是因為?make()?使用的是一種動態數組算法,一開始先向操作系統申請一小塊內存,這個就是?cap,等?cap?被?len?占用滿以后就需要擴容,擴容就是動態數組再去向操作系統申請當前長度的兩倍的內存,然后將舊數據復制到新內存空間中?,一般動態數組每次擴容都是原來的兩倍,那么再來思考一個問題: 動態數組會一直這樣擴容下去嗎?

????????理論上擴容應該是呈指數增長,但不同的程序員對擴容多少的理解是不一樣的,不同的語言也有不同的算法,不過最后肯定在擴容 n 次后就不能按照倍數來擴了,這是因為有物理內存的限制,避免一次申請過多從而導致內存申請失敗內存浪費的情況

案例演示:

package mainimport "fmt"func main() {//分配片結構;* p==零var p *[]int = new([]int)*p = make([]int, 100, 100) //這樣寫有點復雜,很容易就搞亂了fmt.Println(p)//現在將V分配一個新的數組,100個整型//寫法一//var v? []int = make([]int, 100)//寫法二:非常常用的寫法,簡節明了v := make([]int, 100)fmt.Println(v)}通過make()還可以靈活地創建數組切片。如 //創建切片也使用make函數,它被分配一個零數組和指向這個數組的切片。//創建一個初始元素個數為5的數組切片,元素初始值為0a := make([]int, 5)? // len(a)=5//切片有長度和容量。切片的最大長度就是它的容量。//指定一個切片的容量,通過第三個參數。//創建一個初始元素個數為5的數組切片,元素初始值為0,并預留10個元素的存儲空間b := make([]int, 5, 10)?? ?// len(b)=5, cap(b)=10//通過重新切片,可使切片增加。b = b[:cap(b)] // len(b)=5, cap(b)=5b = b[1:]????? // len(b)=4, cap(b)=4//直接創建并初始化包含5個元素的數組切片c := []int{1,2,3,4,5}

用法:

????????[go學習筆記.第七章.數組和切片] 4.切片的三種使用方式以及注意事項和使用細節?

? ? ? ? [go學習筆記.第九章.map] 1.map的介紹,聲明,使用方式,crud操作以及遍歷

????????[go學習筆記.第十四章.協程和管道] 2.管道

3.總結

  • make僅用來分配及初始化類型為 slice、map、chan 的數據,new 可分配任意類型的數據
  • new分配返回的是指針,即類型 *Type,make 返回引用,即Type
  • new分配的空間被清零, make 分配空間后,會進行初始化?

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

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

相關文章

C++原子操作

8.3.5 原子操作 在同一時刻只有唯一的線程對這個資源進行訪問。這有點類似互斥對象對共享資源的訪問的保護&#xff0c;但是原子操作更加接近底層&#xff0c;因而效率更高。 &#xff08;1&#xff09;pthread #include <stdatomic.h> atomic_int atomicVariable; at…

Python如何從SQL Server存取數據?

在Python中&#xff0c;你可以使用各種庫來連接和操作 SQL Server 數據庫。一種常用的庫是pyodbc&#xff0c;它是一個用于連接到各種數據庫的開源 Python 庫&#xff0c;包括 SQL Server。以下是連接到 SQL Server 并存取數據的基本步驟&#xff1a; 1、安裝 pyodbc 庫&#…

LANA: A Language-Capable Navigator for Instruction Following and Generation

摘要 最近&#xff0c;視覺語言導航&#xff08;VLN&#xff09;——要求機器人代理遵循導航指令——已經取得了巨大的進步。然而&#xff0c;現有文獻最強調將指令解釋為行動&#xff0c;只提供“愚蠢”的尋路代理。在本文中&#xff0c;我們設計了 LANA&#xff0c;一種支持…

【C++ 異常處理】

C 異常處理 ■ C 異常處理簡介■ throw (拋出異常)■ catch (捕獲異常)■ try&#xff08;&#xff09;■ C 標準的異常 ■ C 異常處理簡介 C 異常處理涉及到三個關鍵字&#xff1a;try、catch、throw。 屬性描述throw當問題出現時&#xff0c;程序會拋出一個異常。這是通過使…

【LeetCode-1143】最長公共子序列(動歸)

目錄 題目描述 解法1&#xff1a;動態規劃 代碼實現 題目鏈接 題目描述 給定兩個字符串 text1 和 text2&#xff0c;返回這兩個字符串的最長公共子序列的長度。 一個字符串的 子序列 是指這樣一個新的字符串&#xff1a;它是由原字符串在不改變字符的相對順序的情況下刪除…

Linux系統這些壓測工具,你用過嗎?

作為一名運維人員,你是否遇到過這種場景?需要用工具測試系統cpu或內存占用高來觸發告警,或者通過壓測測試服務的并發能力。作為運維工程師,也可以通過這些命令復現故障場景。那么通過本文可以讓你掌握常用的測試命令和工具。 更多技術博客,請關注微信公眾號:運維之美 一、…

LIDAR2Camera 手動標定

參考&#xff1a;搞懂了&#xff01;原來激光雷達和相機的內外參是這樣標定的_嗶哩嗶哩_bilibili 代碼下載&#xff1a;SensorsCalibration/lidar2camera at master PJLab-ADG/SensorsCalibration (github.com)

社區店選址評估:利用大數據選址的技巧與策略

在當今數字化的時代&#xff0c;利用大數據進行社區店選址評估已成為一種高效、科學的方法。作為一名開鮮奶吧5年的創業者&#xff0c;我將分享一些利用大數據選址的技巧與策略&#xff0c;幫助你找到最適合的店鋪位置。 1、確定目標商圈 在選址之前&#xff0c;首先要明確自己…

涉及主頁面內嵌iframe中的列表數據的保存

場景&#xff1a;主表 : 附表 1 : m&#xff0c;同一個頁面&#xff0c;共同使用一個保存按鈕進行兩個表的數據保存&#xff0c;頁面中間有個查詢按鈕&#xff0c;可以對子iframe頁面的內容進行刷新 流程項目頁面內嵌了個子iframe&#xff0c;項目頁面表單數據提交保存是一個…

爬蟲的一些小技巧總結

一、在爬蟲中&#xff0c;爬取的數據類型如下 1.document:返回的是一個HTML文檔 2.png:無損的圖片&#xff0c;jpg:壓縮后的圖片,wbep:有損壓縮&#xff0c;比png差&#xff0c;比jpg好 3.avgxml圖像編碼字符串 4.script:腳本文件&#xff0c;依據一定格式編寫的可執行的文…

【大廠AI課學習筆記NO.58】(11)混淆矩陣

混淆矩陣&#xff08;confusion matrix&#xff09;—— 混淆矩陣&#xff08;Confusion Matrix&#xff09;是人工智能領域&#xff0c;特別是在機器學習和深度學習中&#xff0c;用于衡量分類模型性能的重要工具。它通過統計分類模型的真實分類與預測分類之間的結果&#xf…

【python debug】python常見編譯問題解決方法_2

序言 記錄python使用過程中碰到的一些問題及其解決方法上一篇&#xff1a;python常見編譯問題解決方法_1 1. PermissionError: [Errno 13] Permission denied: ‘/lostfound’ 修改前&#xff1a; 修改后&#xff08;解決&#xff09;&#xff1a; 此外&#xff0c;可能文件夾…

leetcode 熱題 100_接雨水

題解一&#xff1a; 按列求&#xff1a;分別考慮每一列的雨水高度&#xff0c;某列的雨水高度只與其左側最高墻和右側最高墻有關&#xff0c;一種情況是該列比左右側的墻都低&#xff0c;則根據木桶效應該列雨水高度為min(左側墻高&#xff0c;右側墻高)-列高&#xff0c;而其余…

智能駕駛及相關零部件攝像頭毫米波雷達激光雷達和芯片滲透率

一、總體情況 乘聯會數據顯示&#xff0c;1月1日至1月28日&#xff0c;全國乘用車廠商新能源車批發銷量為56.7萬輛&#xff0c;同比增長76%&#xff0c;環比下降38%&#xff1b;國內新能源車市場零售銷量為59.6萬輛&#xff0c;同比增長92%&#xff0c;環比下降24%。 二、銷…

考研總計劃(基礎篇)

分為數學&#xff0c;專業課&#xff0c;英語三個部分 數學規劃表 高數基礎&#xff1a;3月初到4月15號 具體實行計劃&#xff1a;分為看課日和寫題日 看課日:早上10點到12點半看課&#xff0c;19:30到21:30繼續看課。 寫題日:早上10點到12點半復習前一天的題目&#xff0…

【word】引用文獻如何標注右上角

一、在Word文檔中引用文獻并標注在右上角的具體步驟如下 1、將光標移動到需要添加文獻標注的位置&#xff1a; 2、在文檔上方的工具欄中選擇“引用”選項&#xff1a; 3、點擊“插入腳注”或“插入尾注”&#xff1a; ①如果選擇的是腳注&#xff0c;則腳注區域會出現在本頁的…

多路轉接之epoll

常用的三個API&#xff1a; epoll_create(); //例如 int epfd epoll(10);創建一棵有10個結點的紅黑樹&#xff0c;注意&#xff1a;這個數只是對內核建議的數值&#xff0c;內核參照這個參數去構建epoll_ctrl();//參數2 op可以取值 EPOLL_CTL_ADD/MOD/DELevents:EPOLLIN/…

Professor教誨-學術筆記1

關于指導學生 自己帶的學生&#xff0c;要把文章從頭到尾檢查好了&#xff0c;再發給professor要至少留給professor一周的時間改文章&#xff0c;太遲了不如放棄DDL要在合作中&#xff0c;充分尊重合作者認真對待向別人求推薦信這件事&#xff0c;別人找你推薦也要慎重&#x…

成為大佬之路--linux軟件安裝使用第000000025篇--linux docker安裝mysql

安裝 1.拉取鏡像 docker pull centos/mysql-57-centos7 2.啟動mysql docker run -di --nametensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 centos/mysql-57-centos7

Pyglet圖形界面版2048游戲——詳盡實現教程(上)

目錄 Pyglet圖形界面版2048游戲 一、色塊展示 二、繪制標題 三、方陣色塊 四、界面布局 五、鍵鼠操作 Pyglet圖形界面版2048游戲 一、色塊展示 準備好游戲數字的背景顏色&#xff0c;如以下12種&#xff1a; COLOR ((206, 194, 180, 255), (237, 229, 218, 255), (23…