首頁  >  文章  >  後端開發  >  僅當滿足特定條件時才建立 GO 結構

僅當滿足特定條件時才建立 GO 結構

WBOY
WBOY轉載
2024-02-08 21:05:49989瀏覽

仅当满足特定条件时才创建 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 或兩者,然後簡化您的複合if 語句作為兩個單獨語句,分別初始化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刪除