Go 快速入門指南 - 嵌套結構體

来源:https://www.cnblogs.com/duanbiaowu/archive/2022/12/22/16998847.html
-Advertisement-
Play Games

概述 Go 支持將多個結構體通過嵌套的方式,組成一個大的結構體,降低了單個結構體複雜度,同時提高了結構體之間組合的靈活性。 例子 為了省略篇幅,本小節只使用 字面量 方式初始化,new() 的初始化方式請參照 結構體 小節。 每個結構體單獨初始化,最後組裝 package main import ( ...


概述

Go 支持將多個結構體通過嵌套的方式,組成一個大的結構體,降低了單個結構體複雜度,同時提高了結構體之間組合的靈活性。

例子

為了省略篇幅,本小節只使用 字面量 方式初始化,new() 的初始化方式請參照 結構體 小節。

每個結構體單獨初始化,最後組裝

package main

import (
    "fmt"
)

type person struct {
    name string
    age  int16
    hobby
    profession
    address
}

type hobby struct {
    values []string
}

type profession struct {
    desc string
}

type address struct {
    tel  string
    area string
}

func main() {
    // 這裡使用單個字元作為變數名稱,僅僅是為了演示,實際開發中要遵守命名規範
    h := hobby{
        values: []string{"讀書", "羽毛球", "電影"},
    }

    p := profession{
        desc: "學生",
    }

    a := address{
        tel:  "123-456789",
        area: "XX 小區 1 棟 2 單元 304",
    }

    li := person{
        name:       "小李",
        age:        12,
        hobby:      h,
        profession: p,
        address:    a,
    }

    fmt.Printf(" 姓名: %s\n 年齡: %d\n 職業: %s\n 愛好: %v\n 電話: %s\n 住址: %s\n",
        li.name, li.age, li.profession.desc, li.hobby.values, li.address.tel, li.area)

    // 其中,嵌套的欄位名可以省略
    fmt.Println("\n 省略掉嵌套的欄位名,列印結果一樣\n")

    fmt.Printf(" 姓名: %s\n 年齡: %d\n 職業: %s\n 愛好: %v\n 電話: %s\n 住址: %s\n",
        li.name, li.age, li.desc, li.values, li.tel, li.area)
}

// $ go run main.go
// 輸出如下 
/**
  姓名: 小李
  年齡: 12
  職業: 學生
  愛好: [讀書 羽毛球 電影]
  電話: 123-456789
  住址: XX 小區 1 棟 2 單元 304

  省略掉嵌套的欄位名,列印結果一樣

  姓名: 小李
  年齡: 12
  職業: 學生
  愛好: [讀書 羽毛球 電影]
  電話: 123-456789
  住址: XX 小區 1 棟 2 單元 304
*/

整個結構體初始化

package main

import (
    "fmt"
)

type person struct {
    name string
    age  int16
    hobby
    profession
    address
}

type hobby struct {
    values []string
}

type profession struct {
    desc string
}

type address struct {
    tel  string
    area string
}

func main() {
    li := person{
        name: "小李",
        age:  12,
        hobby: hobby{
            values: []string{"讀書", "羽毛球", "電影"},
        },
        profession: profession{
            desc: "學生",
        },
        address: address{
            tel:  "123-456789",
            area: "XX 小區 1 棟 2 單元 304",
        },
    }

    fmt.Printf(" 姓名: %s\n 年齡: %d\n 職業: %s\n 愛好: %v\n 電話: %s\n 住址: %s\n",
        li.name, li.age, li.desc, li.values, li.tel, li.area)
}

// $ go run main.go
// 輸出如下 
/**
  姓名: 小李
  年齡: 12
  職業: 學生
  愛好: [讀書 羽毛球 電影]
  電話: 123-456789
  住址: XX 小區 1 棟 2 單元 304
*/

列印結構體

package main

import (
    "fmt"
)

type person struct {
    name string
    age  int16
    hobby
    profession
    address
}

type hobby struct {
    values []string
}

type profession struct {
    desc string
}

type address struct {
    tel  string
    area string
}

func main() {
    li := person{
        name: "小李",
        age:  12,
        hobby: hobby{
            values: []string{"讀書", "羽毛球", "電影"},
        },
        profession: profession{
            desc: "學生",
        },
        address: address{
            tel:  "123-456789",
            area: "XX 小區 1 棟 2 單元 304",
        },
    }

    fmt.Println("預設列印輸出如下")
    fmt.Println(li)

    fmt.Println("列印時加上欄位名")
    fmt.Printf("%+v\n", li)

    fmt.Println("列印時加上嵌套欄位名")
    fmt.Printf("%#v\n", li)
}

// $ go run main.go
// 輸出如下 
/**
  預設列印輸出如下
  {小李 12 {[讀書 羽毛球 電影]} {學生} {123-456789 XX 小區 1 棟 2 單元 304}}

  列印時加上欄位名
  {name:小李 age:12 hobby:{values:[讀書 羽毛球 電影]} profession:{desc:學生} address:{tel:123-456789 area:XX 小區 1 棟 2 單元 304}}

  列印時加上嵌套欄位名
  main.person{name:"小李", age:12, hobby:main.hobby{values:[]string{"讀書", "羽毛球", "電影"}}, profession:main.profession{desc:"學生"}, address:main.address{tel:"123-456789", area:"XX 小區 1 棟 2 單元 304"}}
*/

擴展閱讀

  1. 1. 為什麼有“組合優於繼承”的說法 - 知乎 (https://www.zhihu.com/question/21862257)

聯繫我

公眾號

業精於勤,荒於嬉;行成於思,毀於隨。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原型鏈與繼承 new 關鍵字的執行過程 讓我們回顧一下,this 指向里提到的new關鍵字執行過程。 創建一個新的空對象 將構造函數的原型賦給新創建對象(實例)的隱式原型 利用顯式綁定將構造函數的 this 綁定到新創建對象併為其添加屬性 返回這個對象 手寫new關鍵字的執行過程: function ...
  • Visual Studio Code 介紹 Visual Studio Code 是一款非常輕量的前端代碼編寫工具,也是目前比較主流的。其中還包含了豐富的插件市場、非常好看的界面風格、可在軟體內直接使用命令行工具等。 :::warning 建議 在學習前端之前可以先把軟體下載好,方便實踐操作。 :: ...
  • 我們是袋鼠雲數棧 UED 團隊,致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。 本文作者:霜序(LuckyFBB) 前言 在之前的文章中,我們講述了 React 的數據流管理,從 props → context → Redux,以及 Redux 相 ...
  • //模擬對象 let obj = { numberParams:1, functionParams:() => { console.log('昨天基金全是綠的,只有我的眼睛是紅的'); }, objParams:{ a:1, b:2 } } const newObj = copyObj(obj); ...
  • 一、vuex介紹 目標 什麼是Vuex 為什麼學習Vuex 通信方案 | 組件關係 | 數據通信 | | | | | 父子關係 | 父傳子:props ; 子傳父:$emit | | 非父子關係 | vuex (一種組件通信方案) | Vuex是什麼 概念:專門在 Vue 中實現集中式狀態(數據)管 ...
  • 23種經典設計模式共分為3種類型,分別是創建型、結構型和行為型。 今天,我們把這3種類型分成3個對應的小模塊,逐一帶你回顧一下每一種設計模式的原理、實現、設計意圖和應用場景。 還是那句話,如果你看了之後,感覺都有印象,那就說明學得還不錯;如果還能在腦子裡形成自己的知識架構,閉上眼睛都能回憶上來,... ...
  • 前言 可以通過分析PriorityBlockingQueue來瞭解JUC中的線程安全的隊列實現的一些套路,這些套路會在JUC中其他數據結構實現上反覆出現,從而可以更合理的瞭解那些實現機制背後通用的部分。 BlockingQueue A Queue that additionally supports ...
  • 互斥鎖 對於任一共用資源,同一時間保證只有一個操作者,這種方法稱為 互斥機制。 關鍵字 Mutex 表示互斥鎖類型,它的 Lock 方法用於獲取鎖,Unlock 方法用於釋放鎖。在 Lock 和 Unlock 之間的代碼,可以讀取和修改共用資源,這部分區域稱為 臨界區。 錯誤的併發操作 先來看一個錯 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...