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

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

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

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

然而,如果寫golang真的按寫java的習慣去寫,也容易出問題,因為golang中有指針的概念,雖然這個指針是c/c++的自動化版本,但是卻也有指針的特征,如果不熟悉其中原理,寫出來的程序雖然不至于有運行BUG,性能卻不友好。

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

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

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)生額外的開銷,因為這是按值傳遞的模式。在java中也有這種按值傳遞的拷貝,但是只會在基本類型上起作用,而基本類型體積很小,long才8個字節(jié),int 4個字節(jié),對象都是按引用傳遞。

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

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

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

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

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

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

golang整體的機制雖然偏向于java的易用性,而在變量傳遞返回這一塊,卻繼承了c++的習慣,區(qū)分按值傳遞和按指針傳遞,如果寫代碼的時候值和指針不分,雖然程序不會報錯,但是卻會產(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對象
}

上面的代碼就是個錯誤示范,在java中這么寫完全沒問題,在golang中卻不行,因為這是按值傳遞,會拷貝對象,就跟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 //可以返回,不會拷貝整個對象,只會拷貝指針(8字節(jié))
}

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

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

于此同時,當你直接使用golang內(nèi)置的map或者切片類型,不用擔心這個問題,因為make出來的map或者切片,默認就是指針類型,傳遞和返回時不會按值拷貝。

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Go語言學習之文件操作方法詳解

    Go語言學習之文件操作方法詳解

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

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

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

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

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

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

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

    golang中json的omitempty使用操作

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

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

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

    深入Golang之context的用法詳解

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

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

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

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

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

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

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

最新評論