欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go語言中值類型和指針類型的深入理解

 更新時(shí)間:2022年03月01日 15:17:13   作者:陳大俠  
這篇文章主要給大家介紹了關(guān)于go語言中值類型和指針類型的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

golang這個(gè)語言用起來和java、 c#之類語言差不多,和c/c++差別比較大,有自動(dòng)管理內(nèi)存機(jī)制,省心省力。

然而,如果寫golang真的按寫java的習(xí)慣去寫,也容易出問題,因?yàn)間olang中有指針的概念,雖然這個(gè)指針是c/c++的自動(dòng)化版本,但是卻也有指針的特征,如果不熟悉其中原理,寫出來的程序雖然不至于有運(yùn)行BUG,性能卻不友好。

因此,不能完全以寫java的思路去寫golang,一定要注意其中差別。

我們知道,在java之中,除了基本類型之外,所有的變量類型都是引用類型,你可以隨意的將引用當(dāng)作參數(shù)傳遞,也可以將引用當(dāng)作返回值返回,都不會有任何問題。

public class Main {
    static class Person{
        private String name;
        private String addr;
        private int age;

        public void addAge() {
            age ++;
        }
    }

    private static Person addAge(Person person) {
        person.addAge();
        return person;//可以這么返回,沒任何問題
    }

    public static void main(String[] args){
        Person person = new Person();
        addAge(person);//可以這么調(diào)用,沒任何問題
    }
}

如果你沒寫過c/c++,會覺得這一切顯得這么自然,仿佛這是最常規(guī)的操作。然而如果你寫過c/c++,就會發(fā)現(xiàn)這么寫并不是常態(tài),而是非常美好的事情,在c/c++里面必須避免這么寫。

class Person
{
private:
	string name;
	string addr;
	int age;

public:
	void addAge()
	{
		this->age++;
	}
};

Person addAge(Person person)
{
	person.addAge();
	return person; //不能直接返回,會拷貝person對象
}

int main()
{
	Person person;
	addAge(person);//不能直接傳遞,會拷貝person對象
}

如上面代碼所示,如果將person對象直接傳遞或者返回,會拷貝對象中的數(shù)據(jù),產(chǎn)生額外的開銷,因?yàn)檫@是按值傳遞的模式。在java中也有這種按值傳遞的拷貝,但是只會在基本類型上起作用,而基本類型體積很小,long才8個(gè)字節(jié),int 4個(gè)字節(jié),對象都是按引用傳遞。

在c++中解決這個(gè)問題不止一種手段,但是寫出來的代碼都非常蹩腳難看。在這里我們用指針來解決這個(gè)拷貝問題

class Person
{
private:
	string name;
	string addr;
	int age;

public:
	void addAge()
	{
		this->age++;
	}
};

Person* addAge(Person* person)
{
	person->addAge();
	return person; //可以返回,不會拷貝整個(gè)對象,只會拷貝指針(8字節(jié))
}

int main()
{
	Person person;
	addAge(&person);//取地址后傳遞, 不會拷貝整個(gè)對象,只會拷貝指針(8個(gè)字節(jié))
	//或者
	Person* pPerson = new Person;
	addAge(pPerson);//直接傳遞指針
  delete pPerson;//動(dòng)態(tài)分配必須刪除,否則有內(nèi)存泄露風(fēng)險(xiǎn)
}

c++的做法是不是比java費(fèi)事的多,所以平時(shí)我們吐槽java語法臃腫被c#、person、kotlin調(diào)用,而它卻能吊打c++,因?yàn)閏++能讓你好好的傳遞參數(shù)和返回值都做不到。

golang整體的機(jī)制雖然偏向于java的易用性,而在變量傳遞返回這一塊,卻繼承了c++的習(xí)慣,區(qū)分按值傳遞和按指針傳遞,如果寫代碼的時(shí)候值和指針不分,雖然程序不會報(bào)錯(cuò),但是卻會產(chǎn)生額外的拷貝開銷,對性能不友好。

type Person struct {
	name string
	addr string
	age int
}

func (this* Person) addAge()  {
	this.age++
}

func addAge(person Person) Person  {
	person.addAge()
	return person //不能直接返回,會拷貝person對象
}

func main()  {
	person := Person{}
	addAge(person)//不能直接傳遞,會拷貝person對象
}

上面的代碼就是個(gè)錯(cuò)誤示范,在java中這么寫完全沒問題,在golang中卻不行,因?yàn)檫@是按值傳遞,會拷貝對象,就跟c/c++一樣。

type Person struct {
	name string
	addr string
	age int
}

func (this* Person) addAge()  {
	this.age++
}

func addAge(person* Person) *Person  {
	person.addAge()
	return person //可以返回,不會拷貝整個(gè)對象,只會拷貝指針(8字節(jié))
}

func main()  {
	person := Person{}
	addAge(&person)//取地址后傳遞, 不會拷貝整個(gè)對象,只會拷貝指針(8個(gè)字節(jié))
  //或
  person1 := new(Person)
	addAge(person1)//直接傳遞指針, 不會拷貝整個(gè)對象,只會拷貝指針(8個(gè)字節(jié))
}

這是這是正確的使用方式,按指針傳遞,就跟c/c++一樣。

于此同時(shí),當(dāng)你直接使用golang內(nèi)置的map或者切片類型,不用擔(dān)心這個(gè)問題,因?yàn)閙ake出來的map或者切片,默認(rèn)就是指針類型,傳遞和返回時(shí)不會按值拷貝。

func doSome(input map[string]string) map[string]string  {
	input["hello"] = "world"
	return input //可以直接返回,不會按值拷貝,map默認(rèn)是一個(gè)指針
}

func main() {
	data := make(map[string]string,5)
	doSome(data) //可直接傳遞,不會按值拷貝,map是一個(gè)指針
}

所以,如果你從java轉(zhuǎn)到golang,同時(shí)又沒有寫過c/c++,那么要萬分注意這個(gè)問題,千萬不能完全以寫java代碼的習(xí)慣去寫go,否則在循環(huán)中出現(xiàn)大對象只拷貝,會是性能毒藥。

總而言之,golang這門計(jì)算機(jī)語言,同時(shí)具有java和c/c++的特征,要能好好使用,需要有這兩門語言的基礎(chǔ)。

總結(jié)

到此這篇關(guān)于go語言中值類型和指針類型的文章就介紹到這了,更多相關(guān)go語言值類型和指針類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言學(xué)習(xí)之文件操作方法詳解

    Go語言學(xué)習(xí)之文件操作方法詳解

    這篇文章主要為大家詳細(xì)介紹了Go語言中一些常見的文件操作,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下
    2022-04-04
  • Go實(shí)現(xiàn)跨平臺的藍(lán)牙聊天室示例詳解

    Go實(shí)現(xiàn)跨平臺的藍(lán)牙聊天室示例詳解

    這篇文章主要為大家介紹了Go實(shí)現(xiàn)跨平臺的藍(lán)牙聊天室示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語言omitempty選項(xiàng)的實(shí)現(xiàn)

    Go語言omitempty選項(xiàng)的實(shí)現(xiàn)

    本文主要介紹了Go語言omitempty選項(xiàng)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go語言計(jì)算指定年月天數(shù)的方法

    Go語言計(jì)算指定年月天數(shù)的方法

    這篇文章主要介紹了Go語言計(jì)算指定年月天數(shù)的方法,實(shí)例分析了Go語言操作時(shí)間的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • golang中json的omitempty使用操作

    golang中json的omitempty使用操作

    這篇文章主要介紹了golang中json的omitempty使用操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go常用技能日志log包創(chuàng)建使用示例

    Go常用技能日志log包創(chuàng)建使用示例

    這篇文章主要為大家介紹了Go常用技能日志log包創(chuàng)建使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 深入Golang之context的用法詳解

    深入Golang之context的用法詳解

    本篇文章主要介紹了深入Golang之context的用法詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 一文帶你了解Go語言中time包的時(shí)間常用操作

    一文帶你了解Go語言中time包的時(shí)間常用操作

    在日常開發(fā)中,我們避免不了時(shí)間的使用,我們可能需要獲取當(dāng)前時(shí)間,然后格式化保存,也可能需要在時(shí)間類型與字符串類型之間相互轉(zhuǎn)換等。本文將會對?Go?time?包里面的常用函數(shù)和方法進(jìn)行介紹,需要的可以參考一下
    2022-12-12
  • Golang解析JSON遇到的坑及解決方法

    Golang解析JSON遇到的坑及解決方法

    這篇文章主要為大家介紹了Golang解析JSON時(shí)會遇到的一些坑及解決方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一點(diǎn)的幫助,需要的可以參考一下
    2023-02-02
  • Golang中數(shù)據(jù)結(jié)構(gòu)Queue的實(shí)現(xiàn)方法詳解

    Golang中數(shù)據(jù)結(jié)構(gòu)Queue的實(shí)現(xiàn)方法詳解

    這篇文章主要給大家介紹了關(guān)于Golang中數(shù)據(jù)結(jié)構(gòu)Queue的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評論