Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 对多个结构具有公共功能_Go_Struct - Fatal编程技术网

Go 对多个结构具有公共功能

Go 对多个结构具有公共功能,go,struct,Go,Struct,我有一个用例来定义一个函数(在示例中它是“进程”),这对于两个struct(下面的示例:StudentStats和EmployeeStats)是通用的 对于每个结构,它都有自己的“挂起”函数实现 运行该示例时,出现以下错误: panic:运行时错误:无效内存地址或零指针取消引用 [信号SIGSEGV:分段冲突代码=0x1 addr=0x0 pc=0x4990ba] 解决这个问题的正确方法是什么 主程序包 输入“fmt” 类型Stats结构{ 待定函数(int,int)int } func(g*

我有一个用例来定义一个函数(在示例中它是“进程”),这对于两个struct(下面的示例:StudentStats和EmployeeStats)是通用的 对于每个结构,它都有自己的“挂起”函数实现

运行该示例时,出现以下错误:

panic:运行时错误:无效内存地址或零指针取消引用
[信号SIGSEGV:分段冲突代码=0x1 addr=0x0 pc=0x4990ba]
解决这个问题的正确方法是什么

主程序包
输入“fmt”
类型Stats结构{
待定函数(int,int)int
}
func(g*Stats)进程(){
fmt.Println(“待定条款:”,g.Pending(1,2))
}
//StatsGenerator是案例中任何实体的接口
类型StatsGenerator接口{
过程()
}
//创建结构
类型StudentStats结构{
统计数据
名称字符串
语言字符串
酒石
粒子整数
}
类型EmployeeStats结构{
统计数据
名称字符串
酒石
粒子整数
}
func(a*StudentStats)挂起(x int,y int)int{
//用于标识帐户是否处于stucent的挂起状态的逻辑
返回x+y
}
func(a*EmployeeStats)挂起(x int,y int)int{
//用于标识Account是否处于employe的挂起状态的逻辑
返回x-y
}
//主要方法
func main(){
sResult:=StudentStats{
姓名:“索尼娅”,
语言:“Java”,
酒石:1,
粒子:1,
}
eResult:=员工统计数据{
姓名:“索尼娅”,
酒石:1,
粒子:4,
}
var statsGenerator=[]statsGenerator{
&sResult和eResult,
}
对于u,生成器:=范围statsGenerator{
生成器.进程()
}
}

问题在于您的stats类型嵌入了
stats
结构:

type StudentStats struct {
    Stats
    // [..]
}
这很好,但是您的
Stats
类型有
Pending
字段,这是您在
Process()
中调用的函数:

但是没有任何东西会将值分配给
Pending
,因此它是
nil
,而
g.Pending(1,2)
会死机

我不完全确定代码的意图是什么,但可以将
Pending()
实现为
Stats
上的一个方法,或者在创建结构时指定一个值:

sResult := StudentStats{
    Stats: Stats{
        Pending: func(a, b int) int {
            // Do something.
        }
    },
    // [..]
}

问题是您的stats类型嵌入了
stats
struct:

type StudentStats struct {
    Stats
    // [..]
}
这很好,但是您的
Stats
类型有
Pending
字段,这是您在
Process()
中调用的函数:

但是没有任何东西会将值分配给
Pending
,因此它是
nil
,而
g.Pending(1,2)
会死机

我不完全确定代码的意图是什么,但可以将
Pending()
实现为
Stats
上的一个方法,或者在创建结构时指定一个值:

sResult := StudentStats{
    Stats: Stats{
        Pending: func(a, b int) int {
            // Do something.
        }
    },
    // [..]
}

好的,这是我应该给出的答案

我将创建函数来创建新的StudentStat/EmployeeStat,以正确设置
挂起的
函数:

func NewStudentStats(名称、语言字符串、字符、粒子整数)*StudentStats{
统计信息:=&StudentStats{
姓名:姓名,,
语言:语言,
牙垢:牙垢,
粒子:粒子,
}
//将正确的挂起函数设置为内部的Stats结构:
stats.stats.Pending=stats.Pending
返回数据
}
有关完整代码,请参见工作示例


请注意我在“继续回答您的问题”中对面向对象编程的评论。

好的,这里是我应该给出的答案

我将创建函数来创建新的StudentStat/EmployeeStat,以正确设置
挂起的
函数:

func NewStudentStats(名称、语言字符串、字符、粒子整数)*StudentStats{
统计信息:=&StudentStats{
姓名:姓名,,
语言:语言,
牙垢:牙垢,
粒子:粒子,
}
//将正确的挂起函数设置为内部的Stats结构:
stats.stats.Pending=stats.Pending
返回数据
}
有关完整代码,请参见工作示例


另请注意我在“继续回答您的问题”中对面向对象编程的评论。

如果公共函数
进程
调用单个函数
挂起
(与您的代码一样)使用组合无法轻松解决此问题。@TehSphinX您有更好的方法解决此问题吗?我可以肯定,在结构中声明函数就像在Stats和Pending中声明函数一样,会使Pending成为函数指针。使用EmployeeStats结构下面使用的语法声明函数。我没有仔细检查,所以可能是错的。接口也可以声明函数,但成员函数必须匹配。我很惊讶你被允许为你的界面声明指向EmployeeStats的指针,因为这些指针没有处理函数。一般来说:Go有一些面向对象的特性,但不是面向对象的语言。您的代码与使用面向对象语言时通常编写的代码类似。试着学着按顺序思考。在我现在5年的围棋生涯中,我以这种方式使用了大约10次作文。大多数情况下,提取公共代码是不值得的。最终,当代码开始有点不同时,它只会带来更多的问题。Go不是尽可能少地键入,而是针对阅读进行了优化。如果通用函数
进程
调用单个函数
挂起
(就像在代码中一样)使用组合无法轻松解决此问题。@TehSphinX您有更好的方法解决此问题吗?我可以肯定,在结构中声明函数就像在Stats和Pending中声明函数一样,会使Pending成为函数指针。使用EmployeeStats结构下面使用的语法声明函数。我没有仔细检查,所以我可能是错的。还有一个接口