第三章 物件導向程式設計
1 go語言中,你可以給任意型別(包括內建型別,但不包含指標型別)新增相應的方法,如下
type integer int
func (a integer) less(b integer) bool
func main()
}
2 go語言中沒有隱藏的this指標,即方法施加的物件為顯示傳遞,也不需要非得是指標,也不用非得叫this
3 陣列作為引數傳遞為值傳遞,即函式內修改不會影響原陣列,陣列切片作為引數傳遞為引用傳遞,即函式內修改會影響原陣列
var a = [3]int
var b = a // 陣列值傳遞
b[1] ++
fmt.println(a,b)
var c = &a // 陣列引用傳遞
c[1] ++
fmt.println(a,*c)
// 輸出
[1 2 3] [1 3 3]
[1 3 3] [1 3 3]
4 如果需要修改物件,才必須使用指標,如下
type integer int
func (a *integer) add(b integer)
func (a integer) add2(b integer)
func main()
5 go語言的型別哪些屬於值傳遞
注:1)陣列切片本質是指向陣列的乙個區間,內部是指向陣列的指標
2)map本質也是乙個字典指標
3)channel和map型別,本質上也是乙個指標
4)介面具備引用語義,是因為內部維持了兩個指標,示意為:
type inte***ce struct
func (r *rect) area() float64
rect1 := new(rect) // 第一種初始化方式
rect2 := &rect{} // 第二種初始化方式
rect3 := &rect // 第三種初始化方式
rect4 := &rect // 第四種初始化方式7 匿名組合,go不支援繼承,但用組合的方式來實現繼承
type base struct
func (base *base) foo()
func (base *base) bar()
type foo struct
func (foo *foo) bar()
補充:匿名組合型別相當於以其型別名稱(去掉包名部分)作為成員變數名,如下
type job struct
8 go語言中沒有關鍵字private,public和protected,可訪問性是包一級而不是類一級。即小寫字母開頭的包內可見
9 go語言採用非侵入式介面
type file struct
func (a *integer) add(b integer)
type lessadder inte***ce
type lessadder2 inte***ce
var a integer = 1
var b lessadder = a // error,因為lessadder介面包含add(),而型別a的add()函式要改變物件值,需要位址賦值
var c lessadder = &a // ok
var d lessadder2 = a // ok,因為lessadder介面沒包含add(),不要求位址賦值
var e lessadder2 = &a // ok11 介面給介面賦值,如果兩個介面同樣的方法列表可以相互賦值,如果乙個介面的方法列表是另乙個介面的方法列表的子集。介面可以賦值給子集的那個,不能反了。
type file struct ,如下
var v1 inte***ce = 1
var v2 inte***ce = "abc"
var v3 inte***ce = &v2
var v4 inte***ce = struct
第三章 物件導向程式設計
一 go語言物件導向的特點 不支援繼承 虛函式 建構函式 析構函式 隱藏的this指標 整個型別系統通過介面串聯 非侵入式介面 二 型別系統 含義 指乙個語言的型別體系結構,包含以下基本內容 基礎型別,如 byte,int,float32等 復合型別,如 陣列,結構體,指標等 可以指向任意物件的an...
C 語言程式設計 第三章
函式呼叫 呼叫函式前要宣告函式原型 型別識別符號 被呼叫函式名 含型別說明的形參表 呼叫形式 函式名 實參列表 函式的遞迴呼叫 函式直接或間接呼叫自身 函式的引數傳遞 1.在函式被呼叫時才分配形參的儲存單元 2.實參可以是常量 變數或表示式 3.實參型別必須與形參相符 如果不相符,編譯器會先進行型別...
Go程式語言讀書筆記 第三章
有符號和無符號整數 8位,16位,32位,64位 int8 int16 int32 int64 uint8 uint16 uint32 uint64 浮點數 float32和float64 字串 內建的len函式返回字串的位元組數,試圖訪問許可範圍以外的位元組會觸發宕機異常。s left foot ...