婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > Golang中匿名組合實(shí)現(xiàn)偽繼承的方法

Golang中匿名組合實(shí)現(xiàn)偽繼承的方法

熱門(mén)標(biāo)簽:高德地圖標(biāo)注口訣 南通如皋申請(qǐng)開(kāi)通400電話 浙江高速公路地圖標(biāo)注 江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 中國(guó)地圖標(biāo)注省會(huì)高清 學(xué)海導(dǎo)航地圖標(biāo)注 西部云谷一期地圖標(biāo)注 廣州呼叫中心外呼系統(tǒng) 地圖標(biāo)注的汽車(chē)標(biāo)

"Go語(yǔ)言的面向?qū)ο髾C(jī)制與一般語(yǔ)言不同。 它沒(méi)有類(lèi)層次結(jié)構(gòu), 甚至可以說(shuō)沒(méi)有類(lèi); 僅僅通過(guò)組合( 而不是繼承) 簡(jiǎn)單的對(duì)象來(lái)構(gòu)建復(fù)雜的對(duì)象。" -- 《Go語(yǔ)言圣經(jīng)》

1.匿名組合

1.1 匿名組合定義

golang中組合語(yǔ)法,就是在一個(gè)類(lèi)中,引入了另一個(gè)類(lèi),如

  type Logger struct{
  }
  type Work struct{
    log Logger
  }
  type Work2 struct{
    log *Logger
  }

  func (Logger)Info(v ...interface{}){
  }

如上邊代碼所示,Work類(lèi)中定義了一個(gè)Logger類(lèi)型的變量,這種是比較常見(jiàn)的引入方式,姑且在此稱(chēng)之為非匿名組合,那什么是匿名組合呢,如其名,就是在組合的過(guò)程中,不給名字唄,如代碼所示:

type Logger struct {
}
type Work struct {
  Logger
}
type Work2 struct {
  *Logger
}

func (Logger) Info(v ...interface{}) {
}

上邊的代碼中,Work類(lèi)與Work2類(lèi)均與Logger類(lèi)匿名組合。兩個(gè)類(lèi)唯一不同的是,Work2中組合的是指針類(lèi)型的Logger類(lèi)。

1.2 組合對(duì)象初始化

非匿名組合初始化方式

func main(){
  var wk = Work{log:Logger{}}
  var wwk = Work{Logger{}}
  //...and so on

  var wk2 = Work2{log:new(Logger)}
  var wwk2 = Work2{new(Logger)}
  //... and so on
}

匿名組合初始化

func main(){
  var wk = Work{Logger{}}
  var wwk = Work{Logger:Logger{}}
  //... and so on
  var wk2 = Work2{new(Logger)}
  var wwk2 = Work2{Logger:Logger{}}
  //... and so on
}

上邊是匿名組合常見(jiàn)的初始化方式。匿名組合后,被包含類(lèi)得方法和屬性可以直接被使用,即使是私有變量。

注意事項(xiàng):

1.匿名組合多個(gè)類(lèi)時(shí),不同的類(lèi)存在相同的方法,會(huì)不會(huì)沖突?答案是,不同的類(lèi)中,不同的方法時(shí)不會(huì)沖突的,但是在調(diào)用這個(gè)方法時(shí),需要明確是那個(gè)類(lèi)中的方法,如果匿名組合進(jìn)來(lái)的類(lèi)得方法,與這個(gè)類(lèi)主體中的方法發(fā)生沖突,那么默認(rèn)情況下,會(huì)使用主體類(lèi)中的方法。

2.匿名組合多個(gè)類(lèi)時(shí),類(lèi)名相同,會(huì)不會(huì)沖突?答案是,會(huì)。就算包名不同,類(lèi)名相同,也會(huì)沖突。

示例代碼:

package main
import(
  "bufio"
)
type Reader struct {
}
type Work4 struct {
  Reader
  bufio.Reader
}

上邊代碼編譯時(shí),會(huì)提示Reader重復(fù)定義 duplicate field Reader

原因在于,匿名組合中,沒(méi)有給引入的類(lèi)命名,所以默認(rèn)采用了類(lèi)名作為屬性名。如上邊wwk2這個(gè)對(duì)象在調(diào)用Logger的Info方法時(shí),可以采用wwk2.Info(“hello”),也可以采用wwk2.Logger.Info(“hello”).

下邊附上一段完整的演示代碼,注意會(huì)報(bào)錯(cuò)哦,這段代碼包含了上邊的duplicate field Reader錯(cuò)誤:

package main

import (
  "bufio"
  "fmt"
)

type Logger struct {
}

type Work struct {
  Logger
}

type Work2 struct {
  *Logger
}
type Work3 struct {
  log *Logger
}

type Reader struct {
}
type Work4 struct {
  Reader
  bufio.Reader
}

func (Logger) Info(v ...interface{}) {
  fmt.Println(v...)
}

func main() {
  var wk = Work{Logger{}}
  wk.Info("hello: Work{Logger{}}")
  var wwk = Work{Logger: Logger{}}
  wwk.Info("hello: Work{Logger: Logger{}}")
  //... and so on
  var wk2 = Work2{new(Logger)}
  wk2.Info("hello: Work2{new(Logger)}")
  var wwk2 = Work2{Logger: Logger{}}
  wwk2.Info("hello: Work2{Logger: Logger{}}")
  wwk2.Logger.Info("hello: wwk2.Logger.Info")

  var wk3 = Work3{new(Logger)}
  wk3.log.Info("hello: Work3{new(Logger)}")
}

3. 結(jié)構(gòu)體嵌入和匿名成員

Go語(yǔ)言提供別樣的 結(jié)構(gòu)體嵌入 機(jī)制,讓一個(gè)結(jié)構(gòu)體包含另一個(gè)結(jié)構(gòu)體類(lèi)型的 匿名成員 , 這樣就可以通過(guò)簡(jiǎn)單的點(diǎn)運(yùn)算符x.f來(lái)訪問(wèn)匿名成員鏈中嵌套的x.d.e.f成員。

Go語(yǔ)言有一個(gè)特性讓我們只聲明一個(gè)成員對(duì)應(yīng)的數(shù)據(jù)類(lèi)型而不指名成員的名字; 這類(lèi)成員就叫匿名成員。 匿名成員的數(shù)據(jù)類(lèi)型必須是命名的(而不是匿名的)類(lèi)型或指向一個(gè)命名的類(lèi)型的指針。

type Circle struct {
 Point
 Radius int
} 

type Wheel struct {
 Circle
 Spokes int
}

由于有了匿名嵌入的特性, 我們可以直接訪問(wèn)內(nèi)嵌類(lèi)型的成員變量而不需要給出完整的路徑:

var w Wheel
w.X = 8 // 等價(jià)于 w.Circle.Point.X = 8
w.Y = 8 // 等價(jià)于 w.Circle.Point.Y = 8
w.Radius = 5 // 等價(jià)于 w.Circle.Radius = 5
w.Spokes = 20

同樣的規(guī)則,內(nèi)嵌類(lèi)型的方法也會(huì)提升為外部類(lèi)型的方法。

3.1 匿名沖突(duplicate field)

匿名成員也有一個(gè)隱式的名字,以其類(lèi)型名稱(chēng)(去掉包名部分)作為成員變量的名字。 因此不能同一級(jí)同時(shí)包含兩個(gè)類(lèi)型相同的匿名成員, 這會(huì)導(dǎo)致名字沖突。

type Logger struct {
  Level int
}

type MyJob struct {
  *Logger
  Name string
  *log.Logger // duplicate field Logger
}

4. 匿名組合不是繼承

4.1 方法的接受者沒(méi)變

當(dāng)我們嵌入一個(gè)類(lèi)型,這個(gè)類(lèi)型的方法就變成了外部類(lèi)型的方法,但是當(dāng)它被調(diào)用時(shí),方法的接受者是內(nèi)部類(lèi)型(嵌入類(lèi)型),而非外部類(lèi)型。— Effective Go

type Job struct {
 Command string
 *log.Logger
}

func (job *Job)Start() {
 job.Log("starting now...")
 ... // 做一些事情
 job.Log("started.")
}

上面這個(gè)Job例子,即使組合后調(diào)用的方式變成了job.Log(...),但Log函數(shù)的接收者仍然是 log.Logger指針,因此在Log中也不可能訪問(wèn)到j(luò)ob的其他成員方法和變量。

4.1 內(nèi)嵌類(lèi)型不是基類(lèi)

如果讀者對(duì)基于 類(lèi) 來(lái)實(shí)現(xiàn)的面向?qū)ο笳Z(yǔ)言比較熟悉的話, 可能會(huì)傾向于將 內(nèi)嵌類(lèi)型 看作一個(gè)基類(lèi), 而 外部類(lèi)型 看作其子類(lèi)或者繼承類(lèi), 或者將 外部類(lèi)型 看作 "is a" 內(nèi)嵌類(lèi)型 。 但這樣理解是錯(cuò)誤的。

type Point struct{ X, Y float64 }

type ColoredPoint struct {
 Point
 Color color.RGBA
}

func (p Point) Distance(q Point) float64 {
 dX := q.X - p.X
 dY := q.Y - p.Y
 return math.Sqrt(dX*dX + dY*dY)
}

請(qǐng)注意上面例子中對(duì)Distance方法的調(diào)用。 Distance有一個(gè)參數(shù)是Point類(lèi)型, 但q并不是一個(gè)Point類(lèi), 所以盡管q有著Point這個(gè)內(nèi)嵌類(lèi)型, 我們也必須要顯式地選擇它。 嘗試直接傳q的話你會(huì)看到錯(cuò)誤:

red := color.RGBA{255, 0, 0, 255}
blue := color.RGBA{0, 0, 255, 255}
var p = ColoredPoint{Point{1, 1}, red}
var q = ColoredPoint{Point{5, 4}, blue}
fmt.Println(p.Distance(q.Point)) // "5"

p.Distance(q) // compile error: cannot use q (ColoredPoint) as Point

一個(gè)ColoredPoint并不是一個(gè)Point, 但ColoredPoint "has a" Point, 并且它有從Point類(lèi)里引入的 Distance方法。

實(shí)際上,從實(shí)現(xiàn)的角度來(lái)考慮問(wèn)題, 內(nèi)嵌字段會(huì)指導(dǎo)編譯器去生成額外的包裝方法來(lái)委托已經(jīng)聲明好的方法, 和下面的形式是等價(jià)的:

func (p ColoredPoint) Distance(q Point) float64 {
 return p.Point.Distance(q)
}

當(dāng)Point.Distance被以上編譯器生成的包裝方法調(diào)用時(shí), 它的接收器值是p.Point, 而不是p。

4.3 匿名沖突(duplicate field) 和隱式名字

匿名成員也有一個(gè)隱式的名字,以其類(lèi)型名稱(chēng)(去掉包名部分)作為成員變量的名字。 因此不能同一級(jí)同時(shí)包含兩個(gè)類(lèi)型相同的匿名成員, 這會(huì)導(dǎo)致名字沖突。

type Logger struct {
Level int
}

type MyJob struct {
*Logger
Name string
*log.Logger // duplicate field Logger
}

以下兩點(diǎn)都間接說(shuō)明匿名組合不是繼承:

  • 匿名成員有隱式的名字
  • 匿名可能沖突(duplicate field)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:德宏 吐魯番 常州 東營(yíng) 貴州 曲靖 保定 許昌

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang中匿名組合實(shí)現(xiàn)偽繼承的方法》,本文關(guān)鍵詞  Golang,中,匿名,組合,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang中匿名組合實(shí)現(xiàn)偽繼承的方法》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Golang中匿名組合實(shí)現(xiàn)偽繼承的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    色综合婷婷久久| 国产精品视频在线看| 日韩理论在线观看| 懂色av中文一区二区三区| 亚洲日本欧美天堂| 国产欧美va欧美不卡在线| 欧美成人a在线| 99精品视频一区| 国产成人av电影在线| 7777精品伊人久久久大香线蕉的| 成人激情综合网站| 亚洲精品大片www| 欧美tickle裸体挠脚心vk| 99re成人精品视频| 亚洲成人免费av| 国产精品视频在线看| 欧美性猛交xxxxxx富婆| 美女网站色91| 美女网站一区二区| 亚洲第一精品在线| 一色屋精品亚洲香蕉网站| 国产女人水真多18毛片18精品视频| 欧美一区二区免费观在线| gogo大胆日本视频一区| 成人精品视频一区| 北岛玲一区二区三区四区| 国产精品久久久久久久久晋中| 欧美区一区二区三区| 福利一区在线观看| 中文字幕va一区二区三区| 欧美性色aⅴ视频一区日韩精品| 国产乱码精品一区二区三区五月婷| 日韩精品电影在线观看| 首页国产丝袜综合| 久久99热这里只有精品| 不卡的av在线| 国产伦精品一区二区三区免费迷 | www久久久久| 日韩欧美不卡在线观看视频| 欧美精品免费视频| 欧美日韩中文精品| 欧美精品久久久久久久多人混战| 国产精品99久久久久久久女警| 亚洲一区在线观看网站| 一个色综合av| 亚洲成人av资源| 国产美女娇喘av呻吟久久| www.99精品| 亚洲bdsm女犯bdsm网站| 亚洲一区二区在线视频| 亚洲高清免费观看| 美国毛片一区二区| 99精品视频在线观看| 欧美精品一区二区三区蜜桃视频| 欧美成人女星排行榜| 久久精品人人做| 欧美韩国日本综合| 亚洲男人的天堂在线aⅴ视频| 亚洲成av人片| 国产午夜精品美女毛片视频| 亚洲人精品一区| 亚洲综合激情网| 午夜精品久久久久久久| 婷婷激情综合网| 极品少妇一区二区| 日本在线播放一区二区三区| www.日韩精品| 亚洲精品一区二区三区影院 | 亚洲国产高清在线观看视频| 久久一夜天堂av一区二区三区| 最新国产精品久久精品| 视频一区中文字幕国产| 国产成人午夜高潮毛片| 在线欧美日韩精品| 香蕉影视欧美成人| 成人性视频网站| 免费高清成人在线| 99国产精品国产精品久久| 欧美午夜免费电影| 欧美电影免费观看高清完整版在 | 国产精品区一区二区三区| 日韩av高清在线观看| 成人综合婷婷国产精品久久蜜臀 | 在线播放中文一区| 免费av网站大全久久| 在线观看亚洲一区| 国产精品成人午夜| 国产成人亚洲综合a∨婷婷| 精品国产乱码久久久久久蜜臀| 欧美日韩一级片网站| 国产日产亚洲精品系列| 天天色综合天天| 成人91在线观看| 2023国产一二三区日本精品2022| 久久精子c满五个校花| 中文字幕成人网| thepron国产精品| 欧美国产精品中文字幕| 国产真实乱偷精品视频免| 日韩欧美国产综合一区| 亚洲成av人片在www色猫咪| 成人福利视频网站| 国产精品午夜春色av| 亚洲裸体在线观看| 91精品国产免费| 五月激情综合网| 91精品国产高清一区二区三区| 亚洲va在线va天堂| 欧美天堂亚洲电影院在线播放| 国产精品每日更新| 丰满少妇在线播放bd日韩电影| 久久久久久久一区| 成人久久18免费网站麻豆| 亚洲午夜在线观看视频在线| 91黄色激情网站| 亚洲人成伊人成综合网小说| 国产999精品久久久久久| 日本一区二区三区四区在线视频 | 久久婷婷国产综合精品青草| 久久99精品久久久| 国产精品一二三四区| 日韩欧美在线观看一区二区三区| 国产精品456露脸| 亚洲视频一区二区在线| 91久久精品日日躁夜夜躁欧美| 亚洲欧美中日韩| 欧美亚洲禁片免费| 蜜臀久久99精品久久久画质超高清| 欧美一区二区三区婷婷月色| 国产真实乱偷精品视频免| 综合在线观看色| 日韩欧美国产小视频| 激情图片小说一区| 亚洲人成网站影音先锋播放| 制服.丝袜.亚洲.中文.综合| 成人免费视频caoporn| 一区二区三区不卡视频| 精品国产91久久久久久久妲己| 色婷婷激情一区二区三区| 国产精品女同互慰在线看| 91精品综合久久久久久| 日本女优在线视频一区二区| 日韩免费电影一区| 成人高清视频在线| 亚洲444eee在线观看| 国产亚洲成av人在线观看导航 | 亚洲人成电影网站色mp4| av一区二区久久| 久久精品国产99国产| 中文字幕电影一区| 欧美一区二区观看视频| 精品视频在线看| 亚洲午夜久久久久久久久久久| 精品久久久久久久久久久院品网| 欧美午夜精品久久久久久孕妇| 国产一区999| 国产精品视频一二三| 欧美精品丝袜中出| 色成人在线视频| 成人免费毛片嘿嘿连载视频| 捆绑紧缚一区二区三区视频| 欧美精品一区二区三区在线| 日韩欧美不卡一区| 日韩无一区二区| 欧美日韩国产综合一区二区| 色噜噜久久综合| 成人看片黄a免费看在线| 国产91精品精华液一区二区三区| 韩国一区二区三区| 国产一区中文字幕| 精品午夜一区二区三区在线观看| 免费在线观看视频一区| 亚洲一线二线三线视频| 亚洲国产成人tv| 国产精品不卡视频| 国产精品国产精品国产专区不片| 国产午夜精品在线观看| 国产精品网站导航| 亚洲色欲色欲www| 亚洲三级免费观看| 国产精品久久久久aaaa樱花| 国产精品美女久久久久高潮| 成人欧美一区二区三区小说| 国产精品久久久久一区| 久久久久久亚洲综合| 久久精品一区八戒影视| 6080亚洲精品一区二区| 欧美电影免费观看高清完整版在线 | 欧美综合色免费| 91看片淫黄大片一级| 日韩欧美一卡二卡| 久久综合九色综合欧美亚洲| 国产亚洲精品福利| 亚洲美女免费视频| 日韩av一二三| 国产成人av一区二区| 99久久精品国产毛片| 色婷婷狠狠综合| 日韩一区二区不卡| 国产日韩三级在线|