如果一个指针的值不是nil,我如何记录它的值,否则在GO中记录nil?

9wbgstp7  于 2023-10-14  发布在  Go
关注(0)|答案(4)|浏览(113)

嗨,我想记录一个变量的值,如果它不是nil,否则我想打印其他任何东西
例如:

var point *string
var point2 *string

p:="hi"

point2=&p

fmt.Printf("%v,%v",*point,*point2)

在这种情况下,我会有一个错误,因为点是nill,所以有没有办法打印变量的值,如果它不是nil或打印任何其他东西,如果它是nil?
我想用一种简单的方法来做这件事,而不是创建一个if/else语句来检查变量是否为nil

q9yhzks0

q9yhzks01#

对于一种更通用的方法来注销指针的值,甚至是结构体中的指针,您可以封送到JSON并记录结果。
下面是一个打印单个指针和非指针值的示例,以及使用此方法的结构。

type Line struct {
    Point1 *string
    Point2 *string
    Name   string
}

func main() {
    point1 := "one"
    line := Line{&point1, nil, "fancy"}

    printJSON(line.Point1, line.Point2, line.Name)
    printJSON(line)
}

func printJSON(i ...interface{}) {
    if b, err := json.Marshal(i); err == nil {
        log.Println(string(b))
    }
}

Go Playground

zlwx9yxi

zlwx9yxi2#

由于Go语言中没有?:运算符,所以最好的方法是写一个函数:

func StringPtrToString(p *string) string {
    if p != nil { return *p }
    return "(nil)"
}
c9x0cxw0

c9x0cxw03#

在这种情况下,你可能应该使用if/else,但是如果你对pointpoint2有很多潜在的“if”条件,你可以使用Switch语句。

package main

import (
    "fmt"
)

func main() {

    type Points struct {
        Point  *string
        Point2 *string
    }

    p := "hi"
    pts := Points{nil, &p}

    switch pts.Point {
    case nil:
        fmt.Printf("%v is empty", pts.Point)
    default:
        fmt.Printf("%v", *pts.Point)

    }

    fmt.Println()

    switch pts.Point2 {
    case nil:
        fmt.Printf("%v is empty", pts.Point2)
    default:
        fmt.Printf("%v", *pts.Point2)

    }

}

输出量:

<nil> is empty
hi

Go playground

gorkyyrv

gorkyyrv4#

我可以推荐使用https://github.com/samber/lo
在其他有用的函数中,有FromPtrOr

str := "hello world"
value := lo.FromPtrOr(&str, "empty")
// "hello world"

value := lo.FromPtrOr[string](nil, "empty")
// "empty"

相关问题