golang 方法返回的结构体为什么取不到地址?
发布网友
发布时间:2022-04-20 08:21
我来回答
共1个回答
热心网友
时间:2022-04-10 04:59
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语言为结构体指针专门准备的“->”运算符。
可以使用结构体指针,作为结构体的方法的参数以指代自身吗,
golang 方法返回的结构体为什么取不到地址?
golang方法(method)返回值提取结构体(struct)取不到地址的原因是,①返回值并没有保存到变量中,返回值本身只是临时保存在程序运行的堆栈的某个不确定位置,不能取地址;②实参取地址用的操作符是是&,而形参声明变量类型为指针,需要地址值用的才是*;③声明形参为指针的参数的实参只能为地址值。故先...
golang函数返回值是结构体值的时候,为何不能对成员赋值呢?
1,右值不可赋值 2,函数返回的是右值 getTest()是右值,结构体整体都是右值,右值不可赋值 getTestPoint()返回当然也是右值,但只有指针是右值,即你不能给返回的指针赋值(例如:getTestPoint() = nil),但是可以给指针指向的结构体成员赋值(就像你代码里那样)有右值自然就有左值,左值是可被赋...
golang中返回空结构体可以返回nil吗
不可以,但是结构体指针可以返回nil
golang怎么返回结构体
用golang解析二进制协议时,其实没必要管结构体的字段的对齐规则,何况语言规范也没有规定如何对齐,也就是没有规则。用encoding/binary.Read函数直接读入struct里就行,struct就像c那样写 type Data struct { Size, MsgType uint16 Sequence uint32 // ...} golang编译器加不加padding,Read都能正常...
golang | Go语言入门教程——结构体初始化与继承
直接使用结构体名称,如果不指定参数,会得到一个零值填充的结构体实例。通过在值前加上属性名可以避免混淆。如果需要创建结构体指针,可以在结构体名称前加上取地址符`&`。继承机制 尽管Go语言在面向对象特性上有所简化,许多人认为它在继承方面存在不足。然而,Go的继承实现方式独特,可能与我们通常的...
Golang复制结构体
Golang中复制结构体,可以使用赋值语句 执行结果 可以看出,roger跟mydog在内存中的地址不同。并且对mydog修改属性,对roger没有影响。 但是注意,这里的Dog结构体中的属性,都是值类型。如果是 引用类型 的话,复制的是 指针 ,而不是具体的值。所以通过赋值语句对结构体的拷贝,是 浅拷贝 。如...
Go看源码必会知识之unsafe包
如果要修改其他成员变量,需要进行偏移量计算,才可以对其内存地址修改,所以Offsetof方法就可返回成员变量在结构体中的偏移量,也就是返回结构体初始位置到成员变量之间的字节数。看代码时大家应该要住uintptr的使用,不可以用一个临时变量存储uintptr类型,前面我们提到过用于指针运算,GC不把uintptr当指针,uintptr无法持有...
golang连接池管理tcp?
Golang网络编程丝绸之路-TCP/UDP地址解析 TL;DR在使用Golang编写TCP/UDPsocket的时候,第一步做的就是地址解析。 该函数返回的地址包含的信息如下: TCPAddr里,IP既可以是IPv4地址,也可以是IPv6地址。Port就是端口了。Zone是IPv6本地地址所在的区域。 从返回结果看该函数的参数,network指address的网络类型;address指...
golang数据分析?
Golang内存分配是个相当复杂的过程,其中还掺杂了GC的处理,这里仅仅对其关键数据结构进行了说明,了解其原理而又不至于深陷实现细节。1、Golang程序启动时申请一大块内存并划分成spans、bitmap、arena区域 2、arena区域按页划分成一个个小块。 3、span管理一个或多个页。 4、mcentral管理多个span供线程申请使用 5、mc...
golang 中结构体与字节数组能相互转化么
解码时如下,data为需要解码的字节数组,to为相应的接收结构体,记住to的结构体结构应与被编码的data相一致(这就是gob相对于json的缺陷,解码需要预先知道被解码内容的结构),解码后内容保存在to里面,直接使用to即可 func Decode(data []byte, to interface{}) error { buf := bytes.NewBuffer(data...