如何检查 Go 语言中的空结构体和空指针?

作者站长头像
站长
· 阅读数 4

题目描述

如何检查 Go 语言中的空结构体和空指针?

题目来源及自己的思路

最近在检查产品是否为空,看一下如下代码:

package main

import "fmt"

type Product struct {
    name, category string
    price          float64
    upc            int64
}

func main() {

    var prd Product
    var prdPtr *Product

    fmt.Println("Value: ", prd.name, prd.category, prd.price)

    fmt.Println("Pointer: ", prdPtr)
}

这样直接运行可以得到 Go 为我们生成的空类型,打印结果如下:

Value:    0
Pointer:  <nil>

那么问题来了,如何用 Go 语言程序判断结构体是被初始化为空,还是传值过来为空呢?

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
回复
1个回答
avatar
test
2024-07-06

在 Go 语言中,结构体不能为 nil,只有结构体指针可以为 nil。当你声明一个结构体变量时,它的字段会被初始化为零值。要检查结构体是否为空,你可以检查其所有字段是否为零值。对于结构体指针,你可以检查它是否为 nil。下面是如何检查空结构体和空指针的示例你可以参考一下:

import "fmt"

type Product struct {
    name, category string
    price          float64
    upc            int64
}

func isProductEmpty(prd Product) bool {
    return prd.name == "" && prd.category == "" && prd.price == 0 && prd.upc == 0
}

func main() {

    var prd Product
    var prdPtr *Product

    fmt.Println("Value: ", prd.name, prd.category, prd.price)

    fmt.Println("Pointer: ", prdPtr)

    // 检查结构体是否为空
    if isProductEmpty(prd) {
        fmt.Println("The product struct is empty.")
    } else {
        fmt.Println("The product struct is not empty.")
    }

    // 检查结构体指针是否为空
    if prdPtr == nil {
        fmt.Println("The product pointer is nil.")
    } else {
        fmt.Println("The product pointer is not nil.")
    }
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容