2017-11-25 13:40

# 请说明golang类型是否按值传递

I'm trying to make a very simple program that modifies arrays, but ran across some interesting behavior if I converted them to types. https://play.golang.org/p/KC7mqmHuLw It appears that if I have an array go passes by reference, but if I have a type then go passes by value. Is this correct?

I have two variables b and c, both are arrays of 3 integers, but c is of type cT, in every other respect they should be identical. I can assign values as `b[0]=-1` and `c[0]=-1`, but if I pass those arrays as parameters to a function they act very differently.

The output of the program is:

before b: [1 2 3]

before c: [1 2 3]

*after b: [-1 2 0]

*after c: [-1 2 3]

*what? c: [-1 2 0]

My initial assumption is that the lines "after b" and "after c" should have been the same. Am I doing something incorrectly or am I correct about types passing to functions by value (ie. creating copy of the variable before passing to the function)?

``````package main

import "fmt"

type cT [3]int

func main() {
b := []int{1, 2, 3}
c := cT{1, 2, 3}

fmt.Println("before b:", b)
fmt.Println("before c:", c)

b[0] = -1
c[0] = -1
mangleB(b) // ignore return value
mangleC(c) // ignore return value

fmt.Println("*after b:", b)
fmt.Println("*after c:", c)

c = mangleC(c)
fmt.Println("*what? c:", c)
}

func mangleB(row []int) []int {
row[2] = 0
return row
}

func mangleC(row cT) cT{
row[2] = 0
return row
}
``````

#### 图片转代码服务由CSDN问答提供 功能建议

```程序的输出为： ```

``` b之前：[1 2 3] \ c之前的n ：[1 2 3] * b之后的c：[-1 2 0] * c之后的c：[- 1 2 3] *什么？ c：[-1 2 0] 我最初的假设是，“ b之后”和“ c之后”行应该相同。 我是做错了事还是对通过值传递给函数的类型是正确的（即在传递给函数之前创建变量的副本）？ package main \ nimport“ fmt” type cT [3] int func main（）{ b：= [] int {1，2，3} c：= cT {1,2,3} \ n fmt.Println（“在b：”之前，b） fmt.Println（“在c：”之前，c） b [0] = -1 c [0] = -1 mangleB（b ）//忽略返回值 mangleC（c）//忽略返回值 fmt.Println（“ *之后b：”，b） fmt.Println（“ *之后c：”，c）\ n c = mangleC（c） fmt.Println（“ * what？c：”，c） } func mangleB（row [] int）[] int { row [2] = 0 返回行 } func mangleC（row cT）cT { row [2] = 0 返回行 } ```
` `
``` 写回答 好问题 提建议 追加酬金 关注问题 分享 邀请回答 ```
``` 2条回答 默认 最新 报告相同问题？ 提交 关注问题 相关推荐 更多相似问题 请说明golang类型是否按值传递 2017-11-25 13:40 回答 2 已采纳 The Go Programming Language Specification Array types An array is a numbered sequence Golang切片是否按值传递？ 2016-10-12 08:15 回答 1 已采纳 Yes, everything in Go is passed by value. Slices too. But a slice value is a header, describing a 在GoLang中按值传递或按引用传递更有效？ 2019-02-24 03:31 回答 1 已采纳 When passing interface type as a parameter, pass it by value, note that interface type itself wou 为什么说golang参数传递为值传递？ 2021-05-01 09:48 gu_jin的博客 不同编程语言的函数参数传递方式不尽相同，例如C语言中的int、float等参数类型采用值传递的方式，而数组类型默认为引用传递，C++中的引用传递显而易见，其类型系统直接包含了引用类型。 二、Go语言中的函数传递方式 ... Golang中的值传递 2022-02-15 15:45 Constancy.N的博客 根据这个问题又深入了一下go语言的值类型，引用类型，值传递问题 值类型，引用类型 在go语言中值类型：int、float、bool、string和数组这些类型都属于值类型，值类型的变量直接指向存在内存中的值，值类型的变量的值... Golang 中直接赋值，是值传递还是地址传递? 2022-01-29 19:15 Aurora & Code Is Law的博客 普通变量都是值传递 a := 1 b := a fmt.Printf("%p\n%p", &a, &b) // 0xc0000160a8 // 0xc0000160c0 a := 1.0 b := a fmt.Printf("%p\n%p", &a, &b) // 0xc0000160a8 // 0xc0000160c0 ... 通过Golang中的方法更改类型的基础值 2018-07-24 22:11 回答 1 已采纳 You're assigning a new pointer value to f instead of dereferencing it. Dereference f and assign a Golang从模板到模板传递多个值？ 2018-03-25 06:41 回答 2 已采纳 Quoting from the doc of text/template, the syntax of the {{template}} action: {{template "name"}} golang从指针类型切片复制指针值 2018-07-16 07:41 回答 1 已采纳 From your example and clarification we can focus on main to achieve your goal: type Order struct c语言中分函数可以返回指针类型吗,Golang 中该使用指针类型还是值类型 2021-05-23 10:01 葱丛丛的博客 使用 Golang 的开发者都知道，Go 语言里有指针的概念，它比 C++ 的指针要简单的多，同时你需要记住一个概念：Go 语言是 值传递。我们今天探讨的是在编码的时候到底该使用指针呢还是值类型？在作为参数和返回值的时候... Go函数传参：值传递&用明白Go的指针 2021-11-29 22:16 NJU_lemon的博客 Golang函数传参：值传递 不杠哦，Go语言里面就是没有引用传递 先拿C语言说话，解释一下值传递、指针传递和引用传递的含义 值传递： 形参是实参的拷贝，改变形参的值并不会影响外部实参的值，是将实参的值拷贝到另外... golang简单快速搞懂接口类型 2021-05-27 09:46 高质量coder的博客 golang简单快速搞懂接口类型一.接口是什么二.接口的格式三.接口的实现四.实现后的使用五.接口嵌套六.空接口1.空接口存储任意类型的值2.空接口作为函数的参数3.空接口作为map的值4.空接口作为slice的值七.注意 一.... 如何在Golang中将不同类型的struct作为参数传递给函数 2019-04-30 03:31 回答 1 已采纳 you can use type interface{}: func responseBodyDecoder(resp http.Response,response interface{}) { 在golang中按引用传递数组 2016-08-02 22:27 回答 2 已采纳 As others have mentioned in comments, you probably want to use a slice rather than an array. Slic 在golang中将引用类型转换为值类型 2014-12-27 02:55 回答 1 已采纳 []Person{} is slice of Person, however, you want to have slice of pointer to Person. It should be golang 函数值传递(slice) 2018-05-10 17:50 lcf枫的博客 转载 https://juejin.im/entry/5a1e4bcd6fb9a045090942d8 点击打开链接对于了解一门语言来说，会关心我们在函数调用的时候，参数到底是传的值，还是引用？其实对于传值和传引用，是一个比较...什么是传值（值传递... golang语言-map作为函数参数传递 2021-09-13 17:22 西京刀客的博客 golang语言-map作为函数参数传递 func main(){ m := make(map[int]int) m[1] = 1 fmt.Printf("原始map的内存地址是：%p\n", m) modify(m) fmt.Println("map值被修改了，新值为:", m) } func modify(m interface... go语言传参是值传递还是引用传递 2021-08-23 13:25 peachesTao的博客 现在想想也许是我听错了，他应该说的是：”go没有引用传递，都是值传递“。我们今天就来聊一下这个话题。 一个简单的例子 funcmodifySlice(slice[]int){ slice[0] = 11}funcmain(){mySlice:=[]int{1,2,3} m... Golang类型断言以指向切片 2019-02-24 16:27 回答 1 已采纳 [The text of this answer was originally written by mkopriva] func loadData(collection interface{} [Golang]slice值传递存在的问题 2018-05-03 22:10 WildKid1024的博客 因为slice是指针类型，所以很多人会误以为其传递的是引用，所以在使用的过程中会出现一些非期望的实现。 问题 在使用append函数时，比如以下函数： func sliceModify(slice []int) { // slice[0] = 88 ... 没有解决我的问题, 去提问```
``` 点击登录 提问题 ◇ 欢迎建议意见◇ 用户帮助中心◇ 回答首次被采纳有奖◇ 奖惩公告 悬赏问题 ¥200 NEC红外段码算法分析 ¥100 EBS R12，接收事务处理处理器，状态：错误 ¥100 matlab如何实现二维分布抽样 ¥100 误删oracle安装目录，如何恢复 ¥100 cCS3.3烧录OUT出错，望指点迷津 ¥100 生物SPO2数据拟合问题 ¥100 交换机phy状态寄存器读显示up，但是转发有时断流，请问什么原因？ ¥100 无法执行赋值，因为左侧的大小为 2-by-1，右侧的大小为 2-by-2。 ¥80 求个matlab或者python模型代码，有关最优速度曲线的 ¥75 用python django做web项目，导入bootstrap后显示不正常 ```
``` ```
``` window.csdn.sideToolbar = { options: { afterFinished: function () { setTimeout(function () { var helphtml = '<a class="option-box" data-type="help" href="https://ask.csdn.net/questions/7441224" target="_blank">'+'<img src="https://g.csdnimg.cn/side-toolbar/2.5/images/bangzhucopy.png" alt="" srcset="">'+ '<span class="show-txt">帮助</span></a>'; \$('.csdn-side-toolbar > a:last').before(helphtml); }, 300); }, contentEl: document.getElementsByClassName('floor')[0] } } ```