当前位置: 首页 > 面试题库 >

通过将指针传递给Go中的函数来获取不同的值

魏书
2023-03-14
问题内容

假设我想将指针传递给函数并通过这样做来更改该指针指向的结构的值。我通常通过取消引用指针来做到这一点:

type Test struct { Value int}
func main() {
   var i Test = Test {2}
   var p *Test = &i
   f(p)
   println(i.Value)  // 4
}
func f(p *Test) {
   *p = Test{4}
}

我的问题是,为什么这段代码不会改变价值

type Test struct { Value int}
func main() {
   var i Test = Test {2}
   var p *Test = &i
   f(p)
   println(i.Value)  // 2
}
func f(p *Test) {
   // ?
   p = &Test{4}
}

而这个做:

type Test struct { Value int}
func main() {
   var i Test = Test {2}
   var p *Test = &i
   f(p)
   println(i.Value)  // 4
}
func f(p *Test) {
   p.Value = 4
}

问题答案:

因为这一行:

p = &Test{4}

只需为p变量分配一个新的指针值即可。在f()函数内部,p只是一个局部变量。通过向分配任何新值p,您只是在更改局部变量的值,而 不是
指向的值。

中的p局部变量f()与中的p局部变量无关main()。如果你改变pf(),它不会改变pmain()(这也不会改变尖结构值)。

在第二个示例中:

p.Value = 4

它是以下各项的简写:

(*p).Value = 4

这改变了 尖锐的 价值,因此你会时遵守变化f()的回报。

注意:

顺便提一句,如果在main()函数中将p(地址为main()指针的局部变量)的地址传递给function
f(),则可以修改存储在main的地址p

func f(p **Test) {
    *p = &Test{4}
}

从中main()调用,就像这样:

var i Test = Test{2}
var p *Test = &i
f(&p)
println(i.Value) // 2 - Note that 'i' won't change!
println(p.Value) // 4 - Only the address in 'p' to the new struct value created in f()

但是显然,传递单个指针*Test并修改指针值(p.Value = 4)更有效,更方便且更简洁。



 类似资料:
  • 问题内容: 背景:使用cgo从Golang调用C函数。 我想使用具有以下签名的C函数:。它会修改的数据和,这就是为什么它使用指针,它们的原因。的值是的长度;是一个字符串数组;返回值只是一个(布尔)指示符,用于指示是否存在错误。 在golang中,我可以使用来成功传递和修改。通过使用。示例代码如下: 如您所见,C函数当前为,但我想要的是。 这就是说:我真正想要的是在C中启用对字符串数组的修改(例如,

  • C++ 指针 C++ 允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值: #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {

  • 我编写了一个代码来传递函数指针列表(按其名称)作为参数。但我有错误。你能解释为什么我在做地图时有错误吗? 错误: 34:18:错误:无法将'void(Bar::)(int, int)'转换为'std::map, void(*)(int, int) 35:18:错误:无法将“无效(foo::)(整数,整数)”转换为“标准::映射,无效(*)(整数,整型) 41:70:错误:没有用于调用“std::v

  • 我有以下代码: 我正在尝试将char和char指针数组传递给函数,但上面的代码会导致以下错误和警告: 我正在努力理解问题是什么。

  • C ++允许您传递指向函数的指针。 为此,只需将函数参数声明为指针类型即可。 下面是一个简单的例子,我们将一个无符号长指针传递给一个函数并更改函数内部的值,该函数反映在调用函数中 - #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {

  • 在第4.9小节,我们已经知道,切片实际是一个指向潜在数组的指针。我们常常需要把切片作为一个参数传递给函数是因为:实际就是传递一个指向变量的指针,在函数内可以改变这个变量,而不是传递数据的拷贝。 因此应该这样做: func findBiggest( listOfNumbers []int ) int {} 而不是: func findBiggest( listOfNumbers *[]i