go struct結構體之間的轉換

来源:https://www.cnblogs.com/phpper/archive/2023/04/17/17325687.html
-Advertisement-
Play Games

原文鏈接:https://www.zhoubotong.site/post/94.html 說下背景吧,大家在開發中可能在不同的目錄(package)下定義了相同的struct(屬性參數完全一樣如名字、個數和類型),在方法調用傳參數的時候,可能是用到了其中某一個struct的引用。 那麼這裡就牽扯到 ...


原文鏈接:https://www.zhoubotong.site/post/94.html
說下背景吧,大家在開發中可能在不同的目錄(package)下定義了相同的struct(屬性參數完全一樣如名字、個數和類型),在方法調用傳參數的時候,可能是用到了其中某一個struct的引用。

那麼這裡就牽扯到相互間的轉換:直接上demo:

package main

import "fmt"

type PackgeAResp struct { // 比如這裡是其他目錄xxx 下定義的struct
    ID   int    `gorm:"column:id;" json:"taskId" form:"taskId"`
    Name string `gorm:"column:name;" json:"name" form:"name"`
}

type PackgeBResp struct { // 比如這裡是其他目錄yyy 下定義的struct
    ID   int    `gorm:"column:id;" json:"taskId" form:"taskId"`
    Name string `gorm:"column:name;" json:"name" form:"name"`
}

func demo(info *PackgeBResp) { // 定義參數為目錄yyy 下定義的struct
    fmt.Printf("%#v", info)
}
func main() {
    info := &PackgeAResp{ID: 1, Name: "test"}
    demo(info)
    //demo(&PackgeBResp{ID: info.ID, Name: info.Name}) //通過這樣可以實現,但是比較lower的就是重新賦值,參數多的情況下你的一個個寫入
}

顯然類型不匹配:cannot use info (variable of type *PackgeAResp) as *PackgeBResp value in argument to demo

兩個相同struct是可以強轉換的:

info := &PackgeAResp{ID: 1, Name: "test"}
demo((*PackgeBResp)(info))

image.png

註意:兩個結構體需要有完全相同的欄位(名字、個數和類型)。

再舉個例子:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

type Employee struct {
    Name string
    Age  int
}

func main() {
    var p Person = Person{Name: "John", Age: 30}
    var e Employee = Employee{Name: "Babala", Age: 18}
    p = Person(e) // 把 e 轉成Person
    fmt.Println(p)
}
//輸出 {Babala 18}

當然我們還可以通過結構體進行type重新定義(相當於取別名)的方式實現,Golang認為是新的數據類型,但是相互間是可以強轉的:

type Person struct {
    Name string
    Age  int
}

type Employee struct {
    Name string
    Age  int
}
type E Employee

func main() {
    var s1 Person = Person{Name: "John", Age: 30}
    var s2 E = E{Name: "Babala", Age: 18}
    s1 = Person(s2) // s2 轉成Person結構體
    fmt.Println(s1) //{Babala 18}
}
無論從事什麼行業,只要做好兩件事就夠了,一個是你的專業、一個是你的人品,專業決定了你的存在,人品決定了你的人脈,剩下的就是堅持,用善良專業和真誠贏取更多的信任。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 在SpringBoot框架中,我們使用最多的是Tomcat,這是SpringBoot預設的容器技術,而且是內嵌式的Tomcat。同時,SpringBoot也支持Undertow容器,我們可以很方便的用Undertow替換Tomcat,而Undertow的性能和記憶體使用方面都優於Tomcat,那 ...
  • package.json 備忘清單 如果你以前用過 Node.js,則可能會遇到 package.json 文件。它是一個 JSON 文件,位於項目的根目錄中。你的 package.json 包含關於項目的重要信息。它包含關於項目的使人類可讀元數據(如項目名稱和說明)以及功能元數據(如程式包版本號和 ...
  • # 請先使用命令 pip install sxtwl 安裝依賴庫後,再執行以下腳本 import sxtwl ymc = ["正", "二", "三", "四", "五", "六", "七", "八", "九", "十" ,"冬", "臘"] rmc = ["初一", "初二", "初三", &qu ...
  • 源代碼下載鏈接: 一、賓館客房管理系統開發初衷 隨著互聯網技術的迅速發展,電腦技術的普及以及信息化時代的推波助瀾,賓館客房需求的逐漸增大,這也是挑戰了賓館客房管理方面的技術,以前的人工管理方式已經不再適應現在的環境,取而代之的是先進的賓館客房管理系統,提高了賓館的工作效率,為想要入住賓館的人提供更 ...
  • 代碼如下: import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxin ...
  • 併發工具類 通常我們所說的併發包也就是java.util.concurrent(JUC),集中了Java併發的各種工具類, 合理地使用它們能幫忙我們快速地完成功能 。 作者: 博學谷狂野架構師 GitHub:GitHub地址 (有我精心準備的130本電子書PDF) 只分享乾貨、不吹水,讓我們一起加油 ...
  • 好消息:與上題的Emergency是同樣的方法。壞消息:又錯了&&c++真的比c方便太多太多。 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members ...
  • 安裝Zookeeper和Kafka集群 本文介紹如何安裝Zookeeper和Kafka集群。為了方便,介紹的是在一臺伺服器上的安裝,實際應該安裝在多台伺服器上,但步驟是一樣的。 安裝Zookeeper集群 下載安裝包 從官網上下載安裝包: curl https://dlcdn.apache.org/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...