Go/C++ 語言中的指針比較
世界上很少有事物能在同一特性上同時兼具強大與脆弱的特質。在編程領域,如果要我舉例的話,那就是 C/C++ 語言中的指針。
在系統編程領域,指針帶來的好處毋庸置疑 —— 能夠實現極高的運行速度和底層控制能力。

世界各地的開發者們已經用了 30-40 年的指針,所有事物都會不斷變化發展,指針是否也應該隨之發展呢?
倘若保留指針的功能,同時又能讓其使用起來更加簡便、減少出錯的可能性,會怎樣呢?這就有了 Go 語言,它旨在簡化現代編程。
例 1:自動內存管理
(1) Go:無內存泄漏
在 Go 中,內存管理由垃圾收集器處理,不需要手動分配或釋放內存,從而防止內存泄漏。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func createPerson() *Person {
return &Person{Name: "Alice", Age: 30} // 自動管理內存
}
func main() {
p := createPerson()
fmt.Println(p.Name) // 不需要釋放內存
}(2) C/C++
在 C/C++ 中,必須手動管理內存,忘記釋放內存會導致內存泄漏。
#include <iostream>
#include <string>
struct Person {
std::string Name;
int Age;
};
Person* createPerson() {
return new Person{"Alice", 30}; // 手動分配內存
}
int main() {
Person* p = createPerson();
std::cout << p->Name << std::endl;
// 忘記刪除 p? 內存泄露!
// delete p;
}例 2:Nil指針安全
(1) Go:Nil指針安全
在 Go 中,訪問 nil 指針不會導致程序崩潰。相反,只會返回零值或 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") // 優雅地處理 nil 指針
}
}(2) C/C++
在 C/C++ 中,解引用空指針會導致未定義行為,通常會導致崩潰(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: 用指針訪問結構體字段
type Person struct {
Name string
Age int
}
func main() {
p := &Person{Name: "Alice", Age: 30}
fmt.Println(p.Name) // 即使 'p' 是指針,也不需要 '->',只需要用 '.'
}(2) C/C++
// C++: 用指針訪問結構體字段
struct Person {
std::string Name;
int Age;
};
int main() {
Person* p = new Person{"Alice", 30};
std::cout << p->Name; // 'p' 是指針,需要通過 '->' 訪問
delete p; // 別忘了釋放內存!
}你好,我是俞凡,在Motorola做過研發,現在在Mavenir做技術工作,對通信、網絡、后端架構、云原生、DevOps、CICD、區塊鏈、AI等技術始終保持著濃厚的興趣,平時喜歡閱讀、思考,相信持續學習、終身成長,歡迎一起交流學習。為了方便大家以后能第一時間看到文章,請朋友們關注公眾號"DeepNoMind",并設個星標吧,如果能一鍵三連(轉發、點贊、在看),則能給我帶來更多的支持和動力,激勵我持續寫下去,和大家共同成長進步!
參考資料:
[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























