首页 >后端开发 >Golang >仅当满足特定条件时才创建 GO 结构

仅当满足特定条件时才创建 GO 结构

WBOY
WBOY转载
2024-02-08 21:05:491043浏览

仅当满足特定条件时才创建 GO 结构

php小编子墨将为大家介绍一项重要的特性,即在特定条件下创建GO结构。这项特性使得我们可以根据需要来判断是否创建GO结构,从而提高程序的效率和性能。通过合理地使用这个特性,我们可以避免不必要的GO结构创建,减少内存占用和垃圾回收的压力,以及提高程序的运行效率。在本文中,我们将详细介绍如何使用这个特性,并给出一些实际应用的示例。

问题内容

我的go代码片段如下:

type mystruct struct {
   a int
}

if a == nil {
        cond = 0
        var a_mystruct_obj mystruct  // if this condition is satified then only create this a_mystruct_obj obj
    } else if b == nil {
        cond = 1
        var b_mystruct_obj mystruct  // if this condition is satified then only create this b_mystruct_obj obj

    } else {
        cond = 2 // // if this condition is satified then create both the above structure objects  a_mystruct_obj & b_mystruct_obj.
         // is having the below declaration again in else a valid go code ?
        var a_mystruct_obj mystruct
        var b_mystruct_obj mystruct
    }

我有 c++ 背景。这在 c++ 中会很简单。 go 中有动态内存分配吗?我如何在 go 中实现这一目标?

在 else 中再次声明 2 是否是有效的 go 代码?

var A_mystruct_obj MyStruct
    var B_mystruct_obj MyStruct

或者我是否需要在这里有某种运行时多态性。

更新:

我尝试这样做,但它甚至没有按预期编译。

https://go.dev/play/p/ioq81aexgjn

再次更新

我尝试过这个,似乎有效。这样可以吗?

https://go.dev/play/p/r_ywzmkgrps


正确答案


您的代码中有两个问题:

  1. 您的变量是在封闭范围内声明的,因此从该范围之外无法访问它们(if/else 子句)
  2. 您的变量被声明为值

当您解决第一个问题时,即通过将变量声明移到 if 子句范围之外,以使它们可以被 if 语句后面的代码访问:

    var a_mystruct_obj mystruct
    var b_mystruct_obj mystruct
    if a == nil {
        cond = 0
        // initialise a_mystruct
    } else if b == nil {
        cond = 1
        // initialise b_mystruct
    } else {
        cond = 2
        // initialise a_mystruct and b_mystruct
    }

现在两个变量都已声明,而且两个变量都使用新分配的 mystruct 进行初始化,无论到达 if 语句中的哪个子句。

要解决这个问题,请将变量更改为指针,并在 if 语句的相应分支中分配所需的值:

    var a_mystruct_obj *mystruct
    var b_mystruct_obj *mystruct
    if a == nil {
        cond = 0
        a_mystruct_obj = &mystruct{}
    } else if b == nil {
        cond = 1
        b_mystruct_obj = &mystruct{}
    } else {
        cond = 2
        a_mystruct_obj = &mystruct{}
        b_mystruct_obj = &mystruct{}
    }

额外提示:未来的您会感谢您将其重构为一对语句,确定是否需要 ab 或两者,然后简化您的复合 ab 或两者,然后简化您的复合 if 语句作为两个单独语句,分别初始化 ab 语句作为两个

单独

语句,分别初始化 ab

    var A_mystruct_obj *MyStruct
    var B_mystruct_obj *MyStruct

    areq := a == nil || (..condition 2..) 
    breq := b == nil || (..condition 2..) 
    if areq {
        A_mystruct_obj = &MyStruct{}
    }
    if breq {
        B_mystruct_obj = &MyStruct{}
    }
目的是避免逻辑重复(dry 原则:a 和/或 b 是否需要的问题与初始化 ab不要重复自己

)和关注点分离。即,将

何时需要的问题分开。 em> 必需。condition 2

注意:不可能更具体地说明如何表达 🎜,因为从您发布的代码中不清楚该条件是什么。🎜

以上是仅当满足特定条件时才创建 GO 结构的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除