網站首頁 編程語言 正文
組合字面量
組合字面量是最直接方式初始化Go對象,假設定義了Book類型,使用字面量初始化代碼如下:
type Book struct { title string pages int } // creating a new struct instance b := Book{} // creating a pointer to a struct instance bp := &Book{} // creating an empty value nothing := struct{}{}
當然還可以直接個屬性賦值:
b := Book{ title: "Julius Caesar", pages: 322, }
這種方式的優勢是語法直接、簡單易讀。但不能給每個屬性設置缺省值。所以當類型包括多個缺省值字段時,需要重復寫缺省值字段賦值語句。舉例:
type Pizza struct { slices int toppings []string } somePizza := Pizza{ slices: 6, toppings: []string{"pepperoni"}, } otherPizza := Pizza{ slices: 6, toppings: []string{"onion", "pineapple"}, }
上面示例每次都設置slices屬性為6,另外,如果toppings屬性可以為空,如果沒有初始化則為nil,這可能導致錯誤。
自定義構造函數
如果屬性需要設置默認值或進行初始化,自定義構造函數可能會很有用。下面通過NewPizza構造函數定義Pizza實例:
func NewPizza(toppings []string) () { if toppings == nil { toppings = []string{} } return Pizza{ slices: 6, toppings: toppings, } }
通過使用構造函數可以自定義實例創建過程:
- 給字段設置缺省值,當然還可以利用可選參數方式給不同屬性設置默認值。
- 還可以執行合理性檢查,如toppings是否為nil并初始化。可以利用make或new構造一些數據類型并更好控制內存和容量。
從構造函數返回錯誤
當構造屬性時,可能依賴其他系統或庫會產生錯誤,這時最好返回error。
func NewRemotePizza(url string) (Pizza, error) { // toppings are received from a remote URL, which may fail toppings, err := getToppings(url) if err != nil { // if an error occurs, return the wrapped error along with an empty // Pizza instance return Pizza{}, fmt.Errorf("could not construct new Pizza: %v", err) } return Pizza{ slices: 6, toppings: toppings, }, nil }
返回錯誤有助于將故障條件封裝在構造函數本身中。
interface構造函數
構造函數可以直接返回interface類型,同時在其中初始化具體類型。如果我們想將結構設為私有,同時將其初始化設為公共,這將很有幫助。
還是用Pizza類型舉例,如果有bakery接口,判斷pizza是否可烘烤類型。首先創建Bakeable接口,然后給Pizza類型增加isBaked字段:
// Pizza implements Bakeable type Bakeable interface { Bake() } type Pizza struct { slices int toppings []string isBaked bool } func (p Pizza) Bake() { p.isBaked = true } // this constructor will return a `Bakeable` // and not a `Pizza` func NewUnbakedPizza(toppings []string) Bakeable { return Pizza{ slices: 6, toppings: toppings, } }
最佳實踐
讓我們來看看Go中關于構造函數命名和組織的一些約定:
基本構造函數
對于簡單構造函數返回類型(如Abc,或Xyz類型),則函數分別命名為NewAbc和NewXyz。對于Pizza實例,則構造函數命名為NewPizza。
主包類型
如果在給定包中,初始化變量為主包類型,可以直接命名為New(無需前綴)。舉例,Pizza結構定義在pizza包中,構造函數定義如下:
package pizza type Pizza struct { // ... } func New(toppings []string) Pizza { // ... }
當在其他包中調用函數時,代碼為 p := pizza.New()
。
多個構造函數
有時相同類型可能有多個構造函數。為此,我們使用NewXyz名稱的變體來描述每個方法。舉例,下面有三個方法創建Pizza:
- NewPizza 為主構造方法.
- NewRemotePizza 基于遠處資源的構造方法.
- NewUnbakedPizza 返回Bakeable接口類型的構造方法.
原文鏈接:https://blog.csdn.net/neweastsun/article/details/128735556
相關推薦
- 2022-06-23 android中的adb命令學習_Android
- 2022-07-29 python?判斷字符串當中是否包含字符(str.contain)_python
- 2022-10-02 Go底層channel實現原理及示例詳解_Golang
- 2022-04-10 C#實現計算器功能_C#教程
- 2022-09-22 使用 sed 替換字符串中最后一次出現的字符
- 2022-04-16 詳解C語言通過遞歸與非遞歸實現蛇形矩陣_C 語言
- 2022-06-06 解決Unity無限滾動復用列表的問題_C#教程
- 2022-09-18 Go語言包管理工具Godep的用法_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支