Go Go基礎(八) 結構體和方法

2021-09-19 14:59:48 字數 1877 閱讀 2395

一、 結構體(struct)

1、結構體定義

type identifier struct

宣告:new(type) 和 &type{}是等價的

2、初始化結構體

type interval struct

初始化方式:

intr := interval

(a)intr := interval

(b)intr := interval

(c)

3、 使用工廠方法建立結構體
type matrix struct

func

newmatrix

(params)

*matrix

在其他包裡使用工廠方法:

package main

import

"matrix"

...wrong :=

new(matrix.matrix)

// 編譯失敗(matrix包中的matrix結構體小寫 是私有的)

right := matrix.

newmatrix

(...

)// 例項化 matrix 的唯一方式

注意:試圖 make() 乙個結構體變數,會引發乙個編譯錯誤

4、 帶標籤的結構體

結構體中的字段除了有名字和型別外,還可以有乙個可選的標籤(tag):它是乙個附屬於字段的字串,可以是文件或其他的重要標記。

標籤的內容不可以在一般的程式設計中使用,只有包 reflect 能獲取它。

例子:

package main

import

("fmt"

"reflect"

)type tagtype struct

func

main()

for i :=

0; i <

3; i++

}func

reftag

(tt tagtype, ix int

)

輸出:

an important answer

the name of the thing

how much there are

5| 匿名欄位和內嵌結構體

結構體可以包含乙個或多個 匿名(或內嵌)字段,即這些字段沒有顯式的名字,只有欄位的型別是必須的,此時型別就是欄位的名字。

匿名字段本身可以是乙個結構體型別,即 結構體可以包含內嵌結構體。

在乙個結構體中對於每一種資料型別只能有乙個匿名字段。

二、方法(method)

go 方法是作用在接收者(receiver)上的乙個函式,接收者是某種型別的變數。因此方法是一種特殊型別的函式。

接收者型別可以是(幾乎)任何型別,不僅僅是結構體型別:任何型別都可以有方法,甚至可以是函式型別,可以是 int、bool、string 或陣列的別名型別。

但是接收者不能是乙個介面型別(參考 第 11 章),因為介面是乙個抽象定義,但是方法卻是具體實現;

如果這樣做會引發乙個編譯錯誤:invalid receiver type…。

方法的格式:

func (recv receiver_type) methodname(parameter_list) (return_value_list)

func (_ receiver_type) methodname(parameter_list) (return_value_list)

函式和方法的區別

函式將變數作為引數:function1(recv)

方法在變數上被呼叫:recv.method1()

Golang基礎 結構體 方法

type 結構體名稱 structtype people structvar peo people fmt.print peo 輸出 fmt.printf p peo 會列印記憶體位址值var peo people 按照結構體中屬性的順序進行賦值,可以省略屬性名稱 peo people fmt.pr...

Go 結構體,結構體指標和方法

結構體 講乙個或多個變數組合到一起形成新的型別,這個型別就是結構體,結構體是值型別 定義結構體和賦值 learn go main.go package main import fmt type people struct func main fmt.printf p peo 0x110040f0 賦...

go 結構體和方法

結構體型別的字面量由關鍵字type 型別名稱 關鍵字struct,以及由花括號包裹的若干字段宣告組成。type person struct person 鍵值對的順序與其型別中的字段宣告完全相同的話,我們還可以統一省略掉所有欄位的名稱 person 結構體型別的值字面量時可以只對它的部分字段賦值,甚...