golang函數究竟是值傳遞還是引用傳遞?打賞

接上文,踩完php的坑,又遇到golang,golang和之前提到過的Java、JavaScript類似。

在golang中只存在值傳遞(要么是該值的副本,要么是指針的副本),不存在引用傳遞。之所以對于引用類型的傳遞可以修改原內容數據,是因為在底層默認使用該引用類型的指針進行傳遞,但是也是使用指針的副本,依舊是值傳遞。

如上,golang的傳參形式和Java、JavaScript一致,但又有差別,golang要在聲明struct或者變量時用*標識用指針,否則方法內不能修改外部的值。

同樣的,舉個例子

func main() {
	i:=19
	p:=People{name:"lily",age:&i}
	fmt.Println(p)
	modify(p)
	fmt.Println(p)
}

type People struct {
	name string
	age  *int
}

func (p People) String() string{
	return "name:" + p.name + ",age:"+ strconv.Itoa(*p.age)
}

func modify(p People){
	p.name = "lucy"
	*p.age = 20
}

// 輸出結果

// name:lily,age:19
// name:lily,age:20

// 換個角度,modify改為
func modify(p *People){
	p.name = "lucy"
	*p.age = 20
}
// 調用改為
modify(&p)

// 輸出結果則為

// name:lily,age:19
// name:lucy,age:20

// 當然,也可以把struct改成這樣
func main() {
        n:="lily"
	i:=19
	p:=People{name:&n,age:&i}
	fmt.Println(p)
	modify(p)
	fmt.Println(p)
}

type People struct {
	name *string
	age  *int
}

同上篇,這樣看來,似乎也解決了不少問題,但是同樣的問題,如果大量在函數內修改結構體內部數據,依然有違函數式編程思想,對此只能說仁者見仁智者見智了,大家根據需求自行選擇吧。

golang函數究竟是值傳遞還是引用傳遞?
文章《golang函數究竟是值傳遞還是引用傳遞?》二維碼
  • 微信打賞
  • 支付寶打賞

已有5條評論

  1. 今日新聞

    文章不錯非常喜歡,支持一下

    2019-05-21 00:56 回復
  2. 965影視

    965影視: http://www.965ys.net
    博主你好,友鏈考慮下不?

    2019-05-15 11:43 回復
  3. 螞蟻樂居

    真心不錯,不得不支持一下先!

    2019-05-14 16:23 回復
  4. 天天頭條

    文章不錯非常喜歡

    2019-05-09 00:14 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖