pb中if else如何只返回需要的结果
时间: 2023-05-11 13:05:54 浏览: 68
在 protobuf 中,if else 语句可以通过使用 oneof 关键字来实现只返回需要的结果。oneof 关键字可以让你在多个字段中只选择一个字段进行序列化和反序列化,从而避免了 if else 语句的使用。以下是一个示例代码:
syntax = "proto3";
message ExampleMessage {
oneof result {
int32 success = 1;
string error = 2;
}
}
在这个示例代码中,ExampleMessage 消息包含了一个 oneof 字段 result,其中包含了一个 int32 类型的 success 字段和一个 string 类型的 error 字段。在序列化和反序列化时,只会选择其中一个字段进行操作,从而避免了 if else 语句的使用。
相关问题
void Delete_num(STU** p_head, long long num) { STU* pb, * pf;//pb:指定删除的节点,pf:中间节点 pb = pf = *p_head; if (*p_head == NULL)//链表为空,不用删 { printf("链表为空,没有您要删的节点"); return; } while (pb->num != num && pb->next != NULL)//循环找要删除的节点 { pf = pb; pb = pb->next; } if (pb->num == num)//找到了一个节点的num和num相同 { if (pb == *p_head)//要删除的节点是头节点 { //让保存头结点的指针保存后一个结点的地址 *p_head = pb->next; } else { //前一个结点的指针域保存要删除的后一个结点的地址 pf->next = pb->next; } //释放空间 free(pb); pb = NULL; } else//没有找到 { printf("没有您要删除的节点\n"); } }
这段代码是用于删除指定学号的节点的函数Delete_num的定义。
函数的参数包括一个指向指针的指针p_head,表示链表的首地址;num表示要删除的学号。
函数首先定义了两个指针pb和pf,它们分别指向链表的首节点,并且初始化为*p_head。
接着进行判断,如果链表为空(即*p_head为NULL),则输出"链表为空,没有您要删的节点"的提示信息,并返回。
进入循环,当pb结点的学号不等于要删除的学号,并且pb的下一个结点不为空时,继续循环。在循环中,pf保存pb的值,然后将pb指向下一个结点。
循环结束后,判断pb结点的学号是否等于要删除的学号。如果相等,则表示找到了要删除的节点。
接下来进行判断,如果pb是头节点(即pb等于*p_head),则将*p_head指向pb的下一个节点,即让保存头结点的指针保存后一个结点的地址。
否则,将前一个结点pf的next指针指向pb的下一个节点,即前一个结点的指针域保存要删除的后一个结点的地址。
最后,释放pb所指向的节点的空间,将pb置为NULL。
如果循环结束时pb结点的学号不等于要删除的学号,则表示没有找到要删除的节点,输出"没有您要删除的节点"的提示信息。
需要注意的是,函数中使用了free函数释放节点的空间,以及对链表头节点的操作。这些操作需要根据实际情况进行补充。
优化这段代码func (t *basicInfo) deleteBasic(stub shim.ChaincodeStubInterface, args []string) pb.Response { if len(args) != 1 { return shim.Error("except one args") } else { A := args[0] err := stub.DelState(A) if err != nil { shim.Error("Failed to delete state") } return shim.Success(nil) } }
这段代码可以进一步优化:
1. 在 `if` 语句中,可以直接返回错误,避免使用 `else` 语句。
2. 在 `err` 不为 `nil` 时,应该使用 `shim.Error()` 函数将错误信息返回给调用端。
3. 在 `shim.Success(nil)` 中可以使用 `shim.Success([]byte{})` 替代,以避免在调用端出现错误。
下面是优化后的代码:
```
func (t *basicInfo) deleteBasic(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 1 {
return shim.Error("except one arg")
}
err := stub.DelState(args[0])
if err != nil {
return shim.Error("failed to delete state: " + err.Error())
}
return shim.Success([]byte{})
}
```