go语言 结构体作为返回值 传的是指针吗

Python026

go语言 结构体作为返回值 传的是指针吗,第1张

这个是根据你值的内容来定的啊,看代码

type User struct {

    Name string

}

//例1(返回指针

func test1()*User{

    return new(User) 

}

//例2(返回指针)

func test2()*User{

    return &User{}

}

//例3(返回值)

func test3()User{

    return User{}

}

明白没有?

按照你的定义,slice是切片,而p是指针。切片是一个结构体头部+数组区域,其头部结构定义如下:

struct Slice

{ // must not move anything

byte* array // actual data

uintgo len // number of elements

uintgo cap // allocated number of elements

}

因此,slice的返回其实是头部值返回,函数内外的地址是不同的,这也导致主程序中,ss与pp不同。因为ss是新分配的,pp则是与子程序testInterface中的&slice相同。简单修改你的代码,通过输出对比,会非常清晰:

package main

import (

"fmt"

)

func testInterface() (slice interface{}, p interface{}) {

slice = make([]int, 10)

p = &slice

fmt.Println("debug:testInterface")

fmt.Println(&slice)//两个地址应该相同

fmt.Println(p) //两个地址应该相同

return slice, p

}

func main() {

fmt.Println("debug:main")

ss, pp := testInterface()

fmt.Println(&ss)

fmt.Println(pp) //应该与子程序的输出一致

}

另外,第一个问题就不用多解释,依然是值和指针不同了。

于c语言相同,go中也有指针和结构体的概念。指针表示变量的内存地址,结构体用来存储同一类型的数据。

定义一个指针变量,将变量a的地址赋给指针变量p。这样,指针变量p也就指向了变量a所在的内容空间。

new 函数返回一个指针变量

fmt.scan() 就是传入一个指针变量。

两种方法都可以使用。

以上简要介绍了go语言中的指针和结构体。