網站首頁 編程語言 正文
相同點:
make和new都是用來創建分配類型內存的。
不同點:
先看下面的代碼
package main import "fmt" func main(){ var i *int var x = 10 *i=x fmt.Println(*i) }
編譯過程會出錯
panic: runtime error: invalid memory address or nil pointer dereference <br data-filtered="filtered">[signal 0xc0000005 code=0x1 addr=0x0 pc=0x48b576]
我們的想法是把 10 賦值 i指向的地址,但是這里由于 *i 沒有初始化,所以并不知道 *i的地址是什么,如果直接 *i的賦值為10,那么肯定是不行的(10這個地址沒有)
所以要想使用 *i,需要把 x的地址給i,修改成如下代碼
var i *int var x = 10 i=&x fmt.Println(*i)
補充: * 代表取地址里內容
, &代表取地址
或者使用 new 進行初始化,代碼如下:
var x = 10 var i *int i = new(int) *i=x fmt.Println(*i)
new的源代碼如下
它只接受一個參數,這個參數是一個類型,分配好內存后,返回一個指向該類型內存地址的指針。同時請注意它同時把分配的內存置為零,也就是類型的零值。
make也是用于內存分配的,但是和new不同,它只用于chan、map以及slice的內存創建,
而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了。
綜上:
二者都是內存的分配(堆上)
區別1
- make只用于slice、map以及channel的初始化(非零值);
- new用于類型的內存分配,并且內存置為零。
區別2
- make返回的還是這三個引用類型本身;
- new返回的是指向類型的指針。
原文鏈接:https://www.cnblogs.com/dcz2015/p/10578957.html
相關推薦
- 2022-10-23 python操作SqlServer獲取特定表的所有列名(推薦)_python
- 2024-01-06 Springboot 啟動報錯 The bean ‘xxxx‘, defined in class
- 2022-07-31 如何理解C++指針常量和常量指針_C 語言
- 2022-07-31 Windows使用cmd命令行查看、修改、刪除與添加環境變量_DOS/BAT
- 2022-10-12 Xshell7遠程連接失敗(connection?failed)的問題解決_Linux
- 2022-06-04 .NET中XML序列化和反序列化常用類和屬性小結_實用技巧
- 2022-12-24 Python中random.shuffle()函數用法代碼案例_python
- 2022-07-09 android開機自動啟動app的解決方法_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支