如果指针的值不为零,我如何记录指针的值,否则在GO中记录为零?

时间:2016-11-03 16:19:20

标签: go

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

例如:

var point *string
var point2 *string

p:="hi"

point2=&p

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

在这种情况下我会有一个错误,因为point是nill,所以有没有办法打印变量的值,如果它不是nil或打印其他任何东西,如果它是nil?

我想以一种简单的方式执行此操作,而不是创建if / else语句来检查变量是否为nil

3 个答案:

答案 0 :(得分:1)

在这种情况下你可能应该使用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

答案 1 :(得分:0)

由于Go中没有?:运算符,最好的方法是编写函数:

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

答案 2 :(得分:0)

对于注销指针甚至结构中的指针的值的更通用方法,您可以编组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