- 利用方法來模擬面向?qū)ο?/li>
type student struct{
name string
age int8
}
func (s *student) getName() string {
return s.name
}
func TestClass(t *testing.T){
stu := student{"fangle",20}
t.Log(stu.getName())
}
//result : fangle
方法實(shí)際上也是函數(shù),只是在聲明時(shí)在關(guān)鍵字fun和方法之間增加一個(gè)參數(shù),這個(gè)參數(shù)也稱之為接收者。
- 值接收者與指針接收者
type student struct{
name string
age int8
}
func (s student) setAge(age int8) {
s.age = age
}
func TestClass(t *testing.T){
stu := student{}
stu.setAge(21)
t.Log(stu)
}
//result : {0 }
值接收者得到了結(jié)構(gòu)體的一份拷貝,方法內(nèi)的操作不會(huì)影響調(diào)用者
type student struct{
name string
age int8
}
func (s *student) setAge(age int8) {
s.age = age
}
func TestClass(t *testing.T){
stu := student{}
stu.setAge(21)
t.Log(stu)
}
//result : { 21}
指針接收者得到了結(jié)構(gòu)體指針的一份拷貝,方法內(nèi)操作會(huì)影響調(diào)用者
使用值接收者還是指針接收者,不應(yīng)該由該方法是否修改了接收到到值來決定。這個(gè)決策應(yīng)該基于該類型到本質(zhì)
- 方法的接收者可以是任意自定義類型
type text string
func (t *text) len() int{
return len(*t)
}
func TestClass(t *testing.T){
var msg text = "mysql gone away"
t.Log(msg.len())
}
//result : 15
- String魔術(shù)方法
組合
- 允許結(jié)構(gòu)體內(nèi)嵌
type user struct {
name string
age int8
}
type vip struct {
user
level int8
}
func TestClass(t *testing.T){
one := vip{
user {
name: "fangle",
age: 20,
},1,
}
t.Log(one,one.name,one.user.name)
}
//result : {{fangle 20} 1} fangle fangle
- 利用結(jié)構(gòu)體內(nèi)嵌來實(shí)現(xiàn)組合
type header struct {
meta string
script string
}
type body struct {
div string
table string
script string
}
type html struct {
header
body
script string
}
func TestClass(t *testing.T){
doc := html{
header{"<meta>", "<script0>"},
body{"<div>","<table>","<script1>"},
"<script2>",
}
t.Log(doc,doc.script)
t.Log(doc.header.script,doc.body.script)
}
//result :{{<meta> <script0>} {<div> <table> <script1>} <script2>}
//<script2> <script0> <script1>
如果兩個(gè)內(nèi)嵌結(jié)構(gòu)體之間有同名變量,不允許外層結(jié)構(gòu)體直接訪問變量,必須顯示指定要訪問的是那個(gè)內(nèi)嵌結(jié)構(gòu)體的變量