Go/C++ 語言中的指針比較
世界上很少有事物能在同一特性上同時(shí)兼具強(qiáng)大與脆弱的特質(zhì)。在編程領(lǐng)域,如果要我舉例的話,那就是 C/C++ 語言中的指針。
在系統(tǒng)編程領(lǐng)域,指針帶來的好處毋庸置疑 —— 能夠?qū)崿F(xiàn)極高的運(yùn)行速度和底層控制能力。

世界各地的開發(fā)者們已經(jīng)用了 30-40 年的指針,所有事物都會不斷變化發(fā)展,指針是否也應(yīng)該隨之發(fā)展呢?
倘若保留指針的功能,同時(shí)又能讓其使用起來更加簡便、減少出錯(cuò)的可能性,會怎樣呢?這就有了 Go 語言,它旨在簡化現(xiàn)代編程。
例 1:自動內(nèi)存管理
(1) Go:無內(nèi)存泄漏
在 Go 中,內(nèi)存管理由垃圾收集器處理,不需要手動分配或釋放內(nèi)存,從而防止內(nèi)存泄漏。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func createPerson() *Person {
return &Person{Name: "Alice", Age: 30} // 自動管理內(nèi)存
}
func main() {
p := createPerson()
fmt.Println(p.Name) // 不需要釋放內(nèi)存
}(2) C/C++
在 C/C++ 中,必須手動管理內(nèi)存,忘記釋放內(nèi)存會導(dǎo)致內(nèi)存泄漏。
#include <iostream>
#include <string>
struct Person {
std::string Name;
int Age;
};
Person* createPerson() {
return new Person{"Alice", 30}; // 手動分配內(nèi)存
}
int main() {
Person* p = createPerson();
std::cout << p->Name << std::endl;
// 忘記刪除 p? 內(nèi)存泄露!
// delete p;
}例 2:Nil指針安全
(1) Go:Nil指針安全
在 Go 中,訪問 nil 指針不會導(dǎo)致程序崩潰。相反,只會返回零值或 panic(如果試圖解引用的話)。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
var p *Person // p 是 nil
if p != nil {
fmt.Println(p.Name) // 檢查 nil 是安全的
} else {
fmt.Println("p is nil") // 優(yōu)雅地處理 nil 指針
}
}(2) C/C++
在 C/C++ 中,解引用空指針會導(dǎo)致未定義行為,通常會導(dǎo)致崩潰(segmentation fault)。
#include <iostream>
#include <string>
struct Person {
std::string Name;
int Age;
};
int main() {
Person* p = nullptr; // p is null
std::cout << p->Name << std::endl; // 崩潰: null 指針解引用
}例 3:更好的解引用方法
(1) Golang
// Go: 用指針訪問結(jié)構(gòu)體字段
type Person struct {
Name string
Age int
}
func main() {
p := &Person{Name: "Alice", Age: 30}
fmt.Println(p.Name) // 即使 'p' 是指針,也不需要 '->',只需要用 '.'
}(2) C/C++
// C++: 用指針訪問結(jié)構(gòu)體字段
struct Person {
std::string Name;
int Age;
};
int main() {
Person* p = new Person{"Alice", 30};
std::cout << p->Name; // 'p' 是指針,需要通過 '->' 訪問
delete p; // 別忘了釋放內(nèi)存!
}你好,我是俞凡,在Motorola做過研發(fā),現(xiàn)在在Mavenir做技術(shù)工作,對通信、網(wǎng)絡(luò)、后端架構(gòu)、云原生、DevOps、CICD、區(qū)塊鏈、AI等技術(shù)始終保持著濃厚的興趣,平時(shí)喜歡閱讀、思考,相信持續(xù)學(xué)習(xí)、終身成長,歡迎一起交流學(xué)習(xí)。為了方便大家以后能第一時(shí)間看到文章,請朋友們關(guān)注公眾號"DeepNoMind",并設(shè)個(gè)星標(biāo)吧,如果能一鍵三連(轉(zhuǎn)發(fā)、點(diǎn)贊、在看),則能給我?guī)砀嗟闹С趾蛣恿?,激勵我持續(xù)寫下去,和大家共同成長進(jìn)步!
參考資料:
[1] Pointers Made Painless: How Go Solves C/C++’s Biggest Headache: https://medium.com/@kirubaspace/pointers-made-painless-how-go-solves-c-c-s-biggest-headache-1618e8d14d38























