10 | 面向?qū)ο?/h2>
  • 利用方法來模擬面向?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)體的變量

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容