Go语言 一个Sprintf,有3个不同指针类型的参数,可以是nil,三进制运算符不可用,如何避免写几十行?[已关闭]

yrefmtwq  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(95)

**已关闭。**此问题不符合Stack Overflow guidelines。它目前不接受回答。

这个问题似乎与help center中定义的范围内的编程无关。
上个月关门了。
Improve this question
我要用Sprintf创建这个字符串

message := fmt.Sprintf("Unit %s has a Level of %v, but is of Category %v",
    *entity.Name, *entity.LevelCode, *entity.CategoryCode)

字符串
在实体中,变量是指针,可以是nil

  • Name是一个*string
  • LevelCode有一个*LevelCode类型
  • CategoryCode有一个*CategoryCode类型

但是如果它们有一个值,我需要这个值而不是指针。(即 * 单位ABC的级别为零,但属于行政单位类别 *)
用任何一种语言,我都会这样写:

message := fmt.Sprintf("Unit %s has a Level of %v, but is of %v Category",
    entity.Name != nil ? *entity.Name : "nil", entity.LevelCode != nil ? *entity.LevelCode : "nil", entity.CategoryCode != nil ? *entity.CategoryCode : "nil")


但Go语言不允许使用三元运算符。如果我不处理nil值,Sprintf会抛出一个异常。
所以,我一定要这样开始吗?

if entity.Name == nil && entity.LevelCode != nil && entity.CategoryCode != nil) {
   message := "Unit nil has a Level of nil, but is of nil Category"
}
else {
   if entity.Name != nil && entity.LevelCode != nil && entity.CategoryCode != nil) {
     message := fmt.Sprintf("Unit %s has a Level of nil, but is of nil Category",
    entity.Name != nil ? *entity.Name : "nil")
   }
   else {
      ...

     for 9 combinations of values nil or not nil values, and 9 sprintf formats?
   }
}

What the shortest way to dump my variables content in a formatted line?

hwamh0ep

hwamh0ep1#

谢谢,在你的帮助下,我成功地建立了功能。

// value treat pointers that can be nil, and return their values if they aren't.
func value[T any](v *T) string {
    if (v != nil) {
        return fmt.Sprintf("%v", *v)
    } else {
        return "nil"
    }
}

字符串
往那边打电话

message := fmt.Sprintf("Unit %s has a Level of %v, but is of %v Category",
    value(entity.Name), value(entity.LevelCode), value(entity.CategoryCode))


要为单个Sprintf编写的五个语句...但它有效。

相关问题