Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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-如何确保没有';是否通过gRPC在此代码中发送空字段?_Go_Filtering_Grpc - Fatal编程技术网

Go-如何确保没有';是否通过gRPC在此代码中发送空字段?

Go-如何确保没有';是否通过gRPC在此代码中发送空字段?,go,filtering,grpc,Go,Filtering,Grpc,我正在编写一些代码,用gRPC将日志发送到服务器。我遇到的问题是,日志是不同的,并不是所有日志都有每个字段,但是。我想知道如何只设置logpb.Log中的字段,而不在proto文件中创建几种不同类型的日志? 这都是一种方法,但StackOverflow上的格式设置与之不符。 守则: func (*Client) SendWithgRPC(entry *log.Entry) error { conn, err := grpc.Dial("localhost:50051", g

我正在编写一些代码,用gRPC将日志发送到服务器。我遇到的问题是,日志是不同的,并不是所有日志都有每个字段,但是。我想知道如何只设置logpb.Log中的字段,而不在proto文件中创建几种不同类型的日志? 这都是一种方法,但StackOverflow上的格式设置与之不符。 守则:

func (*Client) SendWithgRPC(entry *log.Entry) error {

conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
    log.Fatalf("Could not connect: %v", err)
}

defer conn.Close()

c := logpb.NewLogServiceClient(conn)

stream, err := c.SendLogs(context.Background())
if err != nil {
    log.Fatalf("Error while calling SendLogs: %v", err)
}

logFields := entry.Data

category := ""
debug_id := ""
request_id := ""
tipi := ""
uri := ""
var user_id int32 = 0
ip := ""

if logFields["category"] != nil {
    category = logFields["category"].(string)
}

if logFields["debug_id"] != nil {
    debug_id = logFields["debug_id"].(string)
}

if logFields["request_id"] != nil {
    request_id = logFields["request_id"].(string)
}

if logFields["type"] != nil {
    tipi = logFields["type"].(string)
}

if logFields["uri"] != nil {
    uri = logFields["uri"].(string)
}

if logFields["user_id"] != nil {
    user_id = int32(logFields["user_id"].(int))
}

if logFields["ip"] != nil {
    ip = logFields["ip"].(string)
}

logEntry := &logpb.Log{
    Time:      entry.Time.String(),
    Level:     entry.Level.String(),
    Msg:       entry.Message,
    Category:  category,
    DebugId:   debug_id,
    Ip:        ip,
    RequestId: request_id,
    Type:      tipi,
    Uri:       uri,
    Id:        user_id,
}

logs := []*logpb.Log{logEntry}
logarray := []*logpb.SendLogsRequest{
    &logpb.SendLogsRequest{
        Logs: logs,
    },
}

fmt.Print(logarray)

for _, req := range logarray {
    stream.Send(req)
}

_, err = stream.CloseAndRecv()
if err != nil {
    fmt.Printf("Error with response: %v", err)
}
return nil
}

您可以使用类似
它提供了使用标记的验证。除了基本的验证之外,这个库还有很多内容。一定要去看看。
示例

尽可能简单:

package main

import (
    "fmt"
    "github.com/go-playground/validator/v10"
)

type Name struct {
    First string `validate:"required"`
    Last  string
}

func main() {
    validName := Name{First: "John"} // Last name is empty and is not required
    invalidName := Name{Last: "Doe"} // first name is empty but is required

    validate := validator.New()

    err := validate.Struct(invalidName)
    if err != nil {
        fmt.Println("invalid name struct caused error")
    }

    err = validate.Struct(validName)
    if err != nil {
        fmt.Println("valid name struct caused error")
    }

    fmt.Println("GoodBye")
}
以上的输出:

invalid name struct caused error
GoodBye
围棋场工作守则: