go语言返回指针 golang返回值

Golang 指针和结构体于c语言相同go语言返回指针,go中也有指针和结构体的概念 。指针表示变量的内存地址go语言返回指针 , 结构体用来存储同一类型的数据 。
定义一个指针变量 , 将变量a的地址赋给指针变量p 。这样,指针变量p也就指向了变量a所在的内容空间 。
new 函数返回一个指针变量
fmt.scan() 就是传入一个指针变量 。
两种方法都可以使用 。
以上简要介绍了go语言中的指针和结构体 。
golang 方法返回的结构体为什么取不到地址?golang方法(method)返回值提取结构体(struct)取不到地址的原因是,①返回值并没有保存到变量中,返回值本身只是临时保存在程序运行的堆栈的某个不确定位置,不能取地址;②实参取地址用的操作符是是,而形参声明变量类型为指针,需要地址值用的才是*;③声明形参为指针的参数的实参只能为地址值 。
故先把修改后的代码列出,修改要点是把“*NewPerson1().Speak()”改为“var b=NewPerson1();(b).Speak()”,同时把“NewPerson2().Speak()”改成“var a=NewPerson2();(a).Speak()” , 代码列出如下:
package main;
import "fmt";
type PersonA struct{
name string
}
func (p *PersonA) Speak () {
fmt.Println ( "person speak" ,p.name)
}
func (p PersonA) Walk ( ){
fmt . Println ( "person walk",p.name)}
func NewPerson1()(p PersonA){
return PersonA{"new Person1"}}
func NewPerson2()(p PersonA){
return PersonA{"new Person2"}}
func main () {
var a=NewPerson2 (); (a).Speak ();
a .Walk ();
fmt. Println ("--------------------") ;
var b=NewPerson1 ();(b).Speak ();
b.Walk ()}
go代码调试效果
关于指针变量的使用这一点go语言和其他有指针的程序语言如c语言是一样的,从来只有返回值为地址/指针,而从没有在赋值前给返回值取地址这种运算,类似的错误晚点再整理 。
不一样的是,go语言更简单go语言函数可以使用结构体或者结构体的指针(pointer)以传递结构体参数,而且和c语言不一样的是,go语言没有区分结构体指针和结构体访问成员的运算符,go语言只有“.”适用于两种情况,而没有c语言为结构体指针专门准备的“-”运算符 。
可以使用结构体指针 , 作为结构体的方法的参数以指代自身吗,
go语言 结构体作为返回值 传的是指针吗这个是根据你值的内容来定的啊,看代码
type User struct {
Name string
}
//例1(返回指针)
func test1()*User{
return new(User)
}
//例2(返回指针)
func test2()*User{
return User{}
}
//例3(返回值)
func test3()User{
return User{}
}
明白没有?
golang函数返回slice和返回 slice的指针有什么区别按照你的定义,slice是切片,而p是指针 。切片是一个结构体头部 数组区域 , 其头部结构定义如下:
structSlice
{// must not move anything
byte*array;// actual data
uintgolen;// number of elements
uintgocap;// 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) //应该与子程序的输出一致
}
另外,第一个问题就不用多解释,依然是值和指针不同了 。
【go语言返回指针 golang返回值】关于go语言返回指针和golang返回值的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读