欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談golang結構體偷懶初始化

 更新時間:2020年12月18日 14:35:23   作者:漁舟唱晚_hanpan  
這篇文章主要介紹了淺談golang結構體偷懶初始化,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

運行一段程序,警告:

service/mysqlconfig.go:63::error: golang.guazi-corp.com/tools/ksql-runner/model.CreatingMysqlMongodbRecord composite literal uses unkeyed fields (vet)

其中,composite literal uses unkeyed fields這個警告找了很久原因,最終發(fā)現是結構體初始化的問題,自己埋雷。

例如,結構體定義如下,

type A struct {
 *B
}

使用下邊無鍵字段初始化,就會警告:

varA := A // b is of type *B

在自己看來b的類型是B*,但編譯器卻不認賬。

正確初始化方法是:

a := A{B: b}

有人說是,這只是針對"go vet"中的一個錯誤的解決方法。

因為go vet默認情況下執(zhí)行所有檢查,如果任何標志顯式設置為true,則僅運行那些測試。

相反,如果任何標志顯式設置為false,則僅禁用那些測試。

因此-printf = true運行printf檢查,-printf = false運行除printf檢查之外的所有檢查。

可以禁用這個檢查,也可以修改代碼,但是規(guī)范代碼更比較合適。

雖然這只是一個警告,有人覺得無關緊要,但是當你幾周或者幾個月后在結構體中添加了一個字段,那么你使用unkeyed初始化的所有東西都會被破壞。顯然,在一個項目中不希望遇到這種錯誤。

補充:golang中結構體的初始化方法(new方法)

準備工作:

定義結構體:Student

import (
 "fmt"
 "reflect"
)
type Student struct {
 StudentId  string `json:"sid"`
 StudentName string `json:"sname"`
 StudentClass string `json:"class"`
 StudentTeacher string `json:"class"`
}

測試代碼如下:

func main() {
 s0 := Student{}
 fmt.Println(s0)
 fmt.Println(reflect.TypeOf(s0))

 s1 := new(Student)
 fmt.Println(s1)
 fmt.Println(reflect.TypeOf(s1))

 s2 := &Student{}
 fmt.Println(s2)
 fmt.Println(reflect.TypeOf(s2))

 s3 := &Student{"", "", "100", "200"}
 fmt.Println(s3)
 fmt.Println(reflect.TypeOf(s3))

 s4:= &Student{StudentId: "100", StudentName: "200"}
 fmt.Println(s4)
 fmt.Println(reflect.TypeOf(s4))
 
}

輸出結果:

{ }
main.Student
&{ }
*main.Student
&{ }
*main.Student
&{ 100 200}
*main.Student
&{100 200 }
*main.Student

注意:

除了s0以外,s1-s4變量全部為指向Rect結構的指針(指針變量),因為使用了new()函數和&操作符

而s0的方法 s0 := Student{} 表示的是一個Student類型,兩者是不一樣的

在Go語言中,未進行初始化的變量都會被初始化為該類型的零值,例如bool類型的零值為false, int類型的零值為0, string類型的零值為空字符串. 在Go語言中沒有構造函數的概念,對象的創(chuàng)建通常交由一個全局的創(chuàng)建函數來完成,以NewXXX來命令,表示"構造函數":

func NewStudent() { 
  return &Student() //返回指針
}

用 new 分配內存 內建函數 new 本質上說跟其他語言中的同名函數功能一樣:new(T) 分配了零值填充的 T 類型的內存空間,并且返回其地址,一個 *T 類型的值。

務必記得 make 僅適用于 map,slice 和 channel,并且返回的不是指針。應當用 new獲得特定的指針。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章

  • Golang中的錯誤處理的示例詳解

    Golang中的錯誤處理的示例詳解

    這篇文章主要為大家詳細介紹了Golang中的錯誤處理的相關資料,文章中的示例代碼講解詳細,對我們學習Golang有一定幫助,需要的可以參考一下
    2022-12-12
  • 關于golang利用channel和goroutine完成統計素數的思路

    關于golang利用channel和goroutine完成統計素數的思路

    這篇文章主要介紹了golang利用channel和goroutine完成統計素數的思路詳解,通過思路圖分析及實例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下
    2021-08-08
  • Go語言中的sync包同步原語最新詳解

    Go語言中的sync包同步原語最新詳解

    Go語言在sync包中提供了一套多才多藝的同步機制,以及用于管理對共享資源的并發(fā)訪問的原子操作,了解這些工具并為您的并發(fā)需求選擇合適的工具是編寫高效可靠的并發(fā)Go程序的關鍵,這篇文章主要介紹了Go語言中的`sync`包同步原語,需要的朋友可以參考下
    2023-12-12
  • golang并發(fā)之使用sync.Pool優(yōu)化性能

    golang并發(fā)之使用sync.Pool優(yōu)化性能

    在Go提供如何實現對象的緩存池功能,常用一種實現方式是sync.Pool,?其旨在緩存已分配但未使用的項目以供以后重用,從而減輕垃圾收集器(GC)的壓力,下面我們就來看看具體操作吧
    2023-10-10
  • Go語言實現AOI區(qū)域視野管理流程詳解

    Go語言實現AOI區(qū)域視野管理流程詳解

    在游戲中,場景里存在大量的物體.如果我們把所有物體的變化都廣播給玩家.那客戶端很難承受這么大的壓力.因此我們肯定會做優(yōu)化.把不必要的信息過濾掉.如只關心玩家視野所看到的.減輕客戶端的壓力,給玩家更流暢的體驗
    2023-03-03
  • go語言中if語句用法實例

    go語言中if語句用法實例

    這篇文章主要介紹了go語言中if語句用法,以實例形式分析了if語句的定義及使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-02-02
  • 如何使用golang實現traceroute

    如何使用golang實現traceroute

    這篇文章主要介紹了如何使用golang實現traceroute,該工具在linux環(huán)境下的命令是traceroute或者tracepath,在windows下命令是tracert,本文給大家詳細講解需要的朋友可以參考下
    2023-04-04
  • Go語言數據結構之二叉樹必會知識點總結

    Go語言數據結構之二叉樹必會知識點總結

    如果你是一個開發(fā)人員,或多或少對樹型結構都有一定的認識。二叉樹作為樹的一種,是一種重要的數據結構,也是面試官經??嫉臇|西。本文為大家總結了一些二叉樹必會知識點,需要的可以參考一下
    2022-08-08
  • Goland調節(jié)字體大小的設置(編輯區(qū),terminal區(qū),頁面字體)

    Goland調節(jié)字體大小的設置(編輯區(qū),terminal區(qū),頁面字體)

    這篇文章主要介紹了Goland調節(jié)字體大小的設置(編輯區(qū),terminal區(qū),頁面字體),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 一文帶你了解Go語言標準庫math和rand的常用函數

    一文帶你了解Go語言標準庫math和rand的常用函數

    這篇文章主要為大家詳細介紹了Go語言標準庫math和rand中的常用函數,文中的示例代碼講解詳細, 對我們學習Go語言有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12

最新評論