英文:
golang return object from a function
问题
我正在努力理解当你从Go函数中返回一个新对象时发生了什么。
你的代码如下:
func createPointerToInt() *int {
i := new(int)
fmt.Println(&i)
return i
}
func main() {
i := createPointerToInt()
fmt.Println(&i)
}
打印出的返回值是:
0x1040a128
0x1040a120
我会期望这两个值是相同的。我不明白为什么会有8字节的差异。
而在我看来,等价的C代码如下:
int* createPointerToInt() {
int* i = new int;
printf("%#08x\n", i);
return i;
}
int main() {
int* r = createPointerToInt();
printf("%#08x\n", r);
return 0;
}
返回的地址是相同的:
0x8218008
0x8218008
我是否漏掉了一些非常明显的东西?任何澄清都将不胜感激!
英文:
I am struggling to understand exactly what is happening when you return a new object from a function in go.
I have this
func createPointerToInt() *int {
i := new(int)
fmt.Println(&i);
return i;
}
func main() {
i := createPointerToInt();
fmt.Println(&i);
}
The values printed returned are
0x1040a128
0x1040a120
I would expect these two values to be the same. I do not understand why there is an 8 byte difference.
In what I see as the equivalent C code:
int* createPointerToInt() {
int* i = new int;
printf("%#08x\n", i);
return i;
}
int main() {
int* r = createPointerToInt();
printf("%#08x\n", r);
return 0;
}
The address returned is the same:
0x8218008
0x8218008
Am I missing something blindingly obvious here? Any clarification would be greatly appreciated!
答案1
得分: 7
你在这里打印指针的地址 fmt.Println(&i);
。试试这样做:
func main() {
i := createPointerToInt();
fmt.Println(i); //---> 移除 & 符号
}
i
是从 createPointerToInt
返回的指针,而 &i
是你尝试打印的指针的地址。请注意,在你的 C 示例中,你打印的是正确的:
printf("%#08x\n", r);
^这里没有 & 符号
英文:
You are printing the address of the pointer here fmt.Println(&i);
. Try this:
func main() {
i := createPointerToInt();
fmt.Println(i); //--> Remove the ampersand
}
i
is the pointer returned from createPointerToInt
- while &i
is the address of the pointer you are trying to print. Note in your C sample you are printing it correctly:
printf("%#08x\n", r);
^No ampersand here
答案2
得分: 2
将&i
更改为i
。您正在打印i的地址,而您应该打印i的值。
func createPointerToInt() *int {
i := new(int)
fmt.Println(*i)
return i
}
func main() {
i := createPointerToInt()
fmt.Println(*i)
}
英文:
Change &i
to i
. You are printing address of i while you should print the value of i.
func createPointerToInt() *int {
i := new(int)
fmt.Println(i);
return i;
}
func main() {
i := createPointerToInt();
fmt.Println(i);
}
答案3
得分: 0
但是为什么在你的原始代码中,这两个指针的地址(指针指向的内存地址除外)是不同的?
func main() {
i := createPointerToInt();
fmt.Println(&i);
}
等同于:
func main() {
var i *int // 声明变量 i
i = createPointerToInt(); // 将声明并初始化在函数内部的不同 i 的值赋给它
fmt.Println(&i);
}
编辑:
要打印结构体的地址,你需要使用:
fmt.Printf("%p\n", &your_struct)
例如:
英文:
But how come in your original code the addresses of the two pointers (not memory addresses the pointers are pointing too) are different?
func main() {
i := createPointerToInt();
fmt.Println(&i);
}
Is equivalent to:
func main() {
var i *int // declare variable i
i = createPointerToInt(); // assign value of
// a different i that was
// declared and initialized
// inside the function
fmt.Println(&i);
}
Edit:
To print the address of a struct you need to use:
fmt.Printf("%p\n", &your_struct)
For example:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论