結構體是由成員構成的復合型別。go 語言使用結構體和結構體成員來描述真實世界的實體和實體對應的各種屬性。
結構體成員,也可稱之為成員變數,字段,屬性。屬性要滿足唯一性。
結構體的概念在軟體工程上舊的術語叫 adt(抽象資料型別:abstract data type)
資料層面,結構體是自定義資料型別,可以理解成是由一系列具有相同或不同型別的資料構成的資料集合。因此結構體也被稱之為抽象資料型別(adt,abstract data type)。
在go語言中,結構體承擔著物件導向語言中類的作用。
go語言中,結構體本身僅用來定義屬性。還可以通過接收器函式來定義方法,使用內嵌結構體來定義繼承。這樣使用結構體相關操作go語言就可以實現oop物件導向程式設計了。
我們先看結構體相關語法,再看oop相關的。
type identifier struct
// 或者 同一型別的字段,可以定義在一行
type identifier struct
go語言提供了以下幾種方法例項化:
// t表示結構體識別符號,v結構體變數
var v t
v := t{} // var v = t{}
v := new(t)
v := &t{} // var v = &t{}
以上方法中,var v t
和v := t{} // var v = t{}
會返回結構體變數,而v := new(t)
和v := &t{} // var v = &t{}
會返回結構體指標。
注意,結構體是值型別,不是引用型別。因此使用不同方式例項化的,在賦值時效果時不一樣的,需要注意。
var v t
和v := t{} // var v = t{}
值傳遞。
v := new(t)
和v := &t{} // var v = &t{}
引用位址傳遞。
go語言會對結構體型別指標做自解析。也就是說,即使獲得的是結構體指標,也不需要使用*v
的語法。
v := &t{}
// 直接使用v.語法即可。自動解析了 *v
v.field
// 相當於,也可以這麼用
(*v).field
使用類似於鍵值對的語法初始化結構體屬性,但此處的鍵指的是結構體內字段:
v := t
如果我們初始化全部的結構體欄位,可以按照定義順序僅僅使用資料部分即可完成初始化:
// 要滿足全部字段,按照定義順序
v := t
要訪問結構體成員,需要使用點號.
操作符,格式為:
v.field
// 獲取
fmt.println(v.field)
// 設定
v.field = new-value
匿名結構體沒有型別名稱,只有欄位和型別定義,無須通過type關鍵字定義就可以直接使用。匿名結構體的初始化寫法由結構體定義和鍵值對初始化兩部分組成。如下所示:
v := struct
注意,匿名結構體,必須要同時初始化,不能僅僅定義匿名結構體。
當需要使用乙個臨時結構體型別時,可以使用匿名結構體。
第一部分完!後續部分為 建構函式,方法,繼承 與oop相關的內容。
原文出自:小韓說課
Go語言中結構體的使用 第2部分OOP
結構體的基本語法請參見 go語言中結構體的使用 第1部分結構體。結構體除了是乙個復合資料之外,還用來做物件導向程式設計。go 語言使用結構體和結構體成員來描述真實世界的實體和實體對應的各種屬性。也就意味著結構體型別可以模擬為其他語言中的 類class 而結構體資料可以模擬為其他語言中的 物件 本文就...
Go語言中的結構體
結構體中字段可以沒有名字,即匿名字段 struct中的每個字段,寫上乙個tag。這個tag可以通過反射的機制獲取到,最常用的場景就是json序列化和反序列化 package main import encoding json fmt type student struct func main 把這個...
go語言中結構體標籤的語法
原文 通過反射獲取結構體的成員型別 通過反射獲取值資訊 提示結構體標籤 struct tag 類似於 c 中的特性 attribute c 允許在類 字段 方法等前面新增 attribute,然後在反射系統中可以獲取到這個屬性系統。例如 conditional debug public static...