偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Go/C++ 語言中的指針比較

開發(fā)
本文比較了 Go 和 C/C++ 對指針的使用,理解 Go 指針的設(shè)計(jì)如何在保留 C/C++ 指針優(yōu)點(diǎn)的基礎(chǔ)上解決其帶來的安全問題。

世界上很少有事物能在同一特性上同時(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

責(zé)任編輯:趙寧寧 來源: DeepNoMind
相關(guān)推薦

2022-01-06 14:25:24

C語言指針內(nèi)存

2009-06-30 10:46:05

多級指針

2023-10-27 11:21:20

C語言Multics語言

2021-12-06 11:19:47

語言指針內(nèi)存

2010-01-15 19:17:48

C++語言

2011-12-25 15:35:05

ibmdwJavaC++

2010-01-18 13:54:28

函數(shù)

2010-01-21 15:48:38

C++語言

2010-01-25 17:05:37

C++語言

2023-05-24 09:31:51

CGo

2010-07-26 16:23:23

Perl語言

2024-04-07 11:33:02

Go逃逸分析

2021-07-15 23:18:48

Go語言并發(fā)

2023-12-21 07:09:32

Go語言任務(wù)

2010-07-13 15:34:09

Perl語言

2011-04-11 11:09:50

this指針

2010-01-11 15:29:13

引用C++語言

2021-04-13 07:58:42

Go語言函數(shù)

2022-03-29 08:30:47

指針數(shù)組C語言

2021-06-08 07:45:44

Go語言優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號