go語言頭禿之路(零)
go語言頭禿之路(一)
go語言頭禿之路(二)
go語言頭禿之路(三)
go語言頭禿之路(五)
go語言頭禿之路(六)
go語言頭禿之路(七)
type 結構體名 struct
結構體四種例項建立方式:
type stu struct
// 1.
var s1 stu
// 2.
s2 := stu
s2_2 :=
&stu
// 例項化為指標型別變數,存的是位址,多用於工廠模式
// 3. 這裡s3.name == (*s3).name,go編譯器會將s3轉義成(*s3),s4同
var s3 *stu =
new(stu)
// 4.
var s4 *stu =
&stu
如果結構體的字段型別(引用型別)是指標、slice、map,他們的零值是nil,即沒有分配空間,在字段使用之前需要先make()
結構體的所有欄位在記憶體中是連續的
兩個結構體無法進行轉換(賦值=),取別名也不行,因為golang會認為這是兩種資料型別,強制轉換時字段要完全一樣(包括名稱、個數)
type a struct
type b struct
var a a
var b b
a = b // 報錯
a =b
(b)// 強制轉換
結構體的大小是宣告中各元素指標大小之和(string指標佔16位元組,int指標佔8位元組),可以使用unsafe.sizeof() 檢視。(go語言中string本質是結構體)
呼叫方式不一樣
對於函式,形參為值型別時不能將指標型別的資料作為實參傳遞,反之同理;
對於方法(如struct的方法),形參和實參不論值型別還是指標型別都可以相互呼叫。
注意:不管呼叫形式如何,真正決定是值拷貝還是位址拷貝得看這個方法是和哪個型別繫結。如果是和值型別繫結,比如(u user),則是值拷貝,如果是和指標型別繫結,如(u *user),則是位址拷貝。
package main
import
"fmt"
type user struct
func
(u user)
change()
func
main()
(&u1)
.change()
// 值拷貝
fmt.
println
("main() user.name:"
, u1.name)
}
說明:
繼承過來的結構體所有屬性和方法都可以使用(不論首字母大小寫都可以)
匿名結構體的屬性和方法呼叫可以簡化匿名結構體名,查詢順序是(就近原則):先找當前結構體的屬性方法,如果沒有就找繼承結構體的屬性方法。
結構體嵌入兩個(或多個)匿名結構體時,如果兩個匿名結構體有同名字段或方法,而當前結構體沒有同名字段方法,在呼叫時必須指定匿名結構體名,否則編譯報錯。(為了**簡潔性,盡量不要使用多重繼承)
如果嵌入的是有名結構體(匿名結構體前帶上別名),則呼叫屬性方法時必須帶上有名結構體別名。
嵌入匿名結構體使用指標型別會比較高效。
package main
import
"fmt"
type product struct
type supermarket struct
type cup struct
func
(p *product)
card()
func
(sm *supermarket)
marketinfo()
func
main()
,&supermarket,}
c1.p.
card()
c1.marketinfo()
fmt.
println
(c1.name)
}
介面inte***ce
介面名一般使用er
結尾;
用於定義一組方法,但不需要實現。
介面不能包含任何變數。
定義介面函式時不能使用指標接收器。
在自定義型別(如結構體)的時候,再把這些方法通通實現。
介面定義中的所有方法都沒有方法體(即都是沒有實現的方法),介面體現了程式設計的多型
和高內聚低耦合
思想。
介面只要乙個變數,含有介面型別中的所有方法,那麼這個變數就實現了這個介面。
語法:
type 介面名 inte***ce
func
(自定義型別別名 自定義型別) 方法1
(引數列表)
[返回值列表]
...
注意:
介面本身不能建立例項,但是可以指向乙個實現了該介面的自定義型別變數(例項);
任何自定義型別都可以實現介面,乙個自定義型別可以實現多個介面;
介面可以繼承多個介面,此時自定義型別需要實現所有方法。但是不允許繼承的介面存在相同的方法,即乙個介面(包括繼承過來的介面)中不能存在相同的方法。
介面型別預設是乙個指標(引用型別),沒有初始化時為nil;
空介面inte***ce{}沒有任何方法,所有型別都實現了空介面,任何變數都可以賦值給空介面。
介面可以在不破壞繼承關係的基礎上增加方法,實現介面是對繼承的補充。
介面&繼承
繼承的價值:解決**復用性
和可維護性
;
介面的價值:設計
好各種規範(方法),讓其他自定義型別去實現這些方法。
介面比繼承更加靈活:繼承是滿足 is - a 的關係,而介面只需滿足 like - a 的關係。
Go之路之go語言結構
package main 定義了包名,必須在原始檔中非注釋的第一行指名這個檔案屬於哪個包,每個go應用程式都包含乙個名為main的包 import fmt 告訴go編譯器這個程式需要使用fmt包,fmt包含了格式化i o的函式 func main 需要注意 在go程式中,一行代表乙個語句的結束,結尾...
go語言初探 四
運算子不細講,和c 差不多,注意優先順序就行了,不過我喜歡加括號。控制語句 在switch case 語句中 可以不用寫break,別問,問就是自帶。還多了fallthrough 可以強行執行後面的case語句。即 從第乙個判斷表示式為 true 的 case 開始執行,如果 case 帶有 fal...
go語言開發之路(1)安裝
tar xzvf go1.14.2.linux amd64.tar.gz 得到目錄 go mv go usr local 修改 etc profile 最後面加上 export gopath mnt win go export goroot usr local go export path path...