golang返回,golang返回接口

本文目录一览:

golang函数返回值是结构体值的时候,为何不能对成员赋值呢?

1,右值不可赋值

2,函数返回的是右值

getTest()是右值,结构体整体都是右值,右值不可赋值

getTestPoint()返回当然也是右值,但只有指针是右值,即你不能给返回的指针赋值(例如:getTestPoint() = nil),但是可以给指针指向的结构体成员赋值(就像你代码里那样)

有右值自然就有左值,左值是可被赋值的,例如

t := getTest() //getTest() 返回的右值,赋值给左值t

t.test = 1,左值可被赋值

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语言为结构体指针专门准备的“-”运算符。

可以使用结构体指针,作为结构体的方法的参数以指代自身吗,

golang怎么返回结构体

用golang解析二进制协议时,其实没必要管结构体的字段的对齐规则,何况语言规范也没有规定如何对齐,也就是没有规则。用encoding/binary.Read函数直接读入struct里就行,struct就像c那样写

type Data struct {

Size, MsgType uint16

Sequence uint32

// ...

}

golang编译器加不加padding,Read都能正常工作,runtime知道Data的布局的,不像C直接做cast所以要知道怎样对齐。

用unsafe.Alignof可以知道每个field的对齐长度,但没必要用到。

package main

/*

#include stdint.h

#pragma pack(push, 1)

typedef struct {

uint16_t size;

uint16_t msgtype;

uint32_t sequnce;

uint8_t data1;

uint32_t data2;

uint16_t data3;

} mydata;

#pragma pack(pop)

mydata foo = {

1, 2, 3, 4, 5, 6,

};

int size() {

return sizeof(mydata);

}

*/

import "C"

import (

"bytes"

"encoding/binary"

"fmt"

"log"

"unsafe"

)

func main() {

bs := C.GoBytes(unsafe.Pointer(C.foo), C.size())

fmt.Printf("len %d data %v\n", len(bs), bs)

var data struct {

Size, Msytype uint16

Sequence uint32

Data1 uint8

Data2 uint32

Data3 uint16

}

err := binary.Read(bytes.NewReader(bs), binary.LittleEndian, data)

if err != nil {

log.Fatal(err)

}

fmt.Printf("%v\n", data) // {1 2 3 4 5 6}

buf := new(bytes.Buffer)

binary.Write(buf, binary.BigEndian, data)

fmt.Printf("%d %v\n", buf.Len(), buf.Bytes()) // 15 [0 1 0 2 0 0 0 3 4 0 0 0 5 0 6]

}

本文链接:https://my.lmcjl.com/post/19624.html

展开阅读全文

4 评论

留下您的评论.