色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

如何實現(xiàn)implements ?

冬至子 ? 來源:洋芋土豆 ? 作者:真沒什么深度 ? 2023-05-22 17:30 ? 次閱讀

概述

Go 中檢測一個類型是否實現(xiàn)了某個接口,通常分為兩類機制: 編譯期間運行期間

編譯期間

顧名思義,編譯期間檢測就是通過靜態(tài)分析來確定類型是否實現(xiàn)了某個接口,如果檢測不通過,則編譯過程報錯并退出。通常將這種方式稱為 接口完整性檢查

接口完整性檢查

類型未實現(xiàn)接口

package main

type Person interface {
    Name() string
    Age() int
}

type Martian struct {
}

func main() {
    // 強制類型 Martian 必須實現(xiàn)接口 Person 的所有方法
    var _ Person = (*Martian)(nil)

    // 1. 聲明一個 _ 變量 (不使用)
    // 2. 把一個 nil 轉換為 (*Martian),然后再轉換為 Person
    // 3. 如果 Martian 沒有實現(xiàn) Person 的全部方法,則轉換失敗,編譯器報錯
}

運行代碼

$ go run main.go
# 輸出如下 
cannot use (*Martian)(nil) (value of type *Martian) as type Person in variable declaration:
        *Martian does not implement Person (missing Age method)

從輸出的結果中可以看到,Martian 并沒有實現(xiàn) Person 接口,所以報錯了。下面我們?yōu)?Martian 實現(xiàn) Person 接口。

類型實現(xiàn)了接口

package main

import "fmt"

type Person interface {
    Name() string
    Age() int
}

type Martian struct {
}

// 實現(xiàn) Name 方法
func (m *Martian) Name() string {
    return "martian"
}

// 實現(xiàn) Age 方法
func (m *Martian) Age() int {
    return -1
}

func main() {
    // 此時 Martian 已實現(xiàn)了 Person 的全部方法
    var _ Person = (*Martian)(nil)

    m := &Martian{}
    fmt.Printf("name = %s, age = %d\\n", m.Name(), m.Age())
}

運行代碼

$ go run main.go
# 輸出如下 
name = martian, age = -1

從輸出的結果中可以看到,運行成功,Martian 已經(jīng)實現(xiàn)了 Person 接口的全部方法。

運行期間

運行期間的檢測方式主要有 類型斷言反射

類型斷言

類型未實現(xiàn)接口

package main

import "fmt"

type Person interface {
    Name() string
    Age() int
}

type Martian struct {
}

func main() {
    // 變量必須聲明為 interface 類型
    var m interface{}
    m = &Martian{}
    if v, ok := m.(Person); ok {
        fmt.Printf("name = %s, age = %d\\n", v.Name(), v.Age())
    } else {
        fmt.Println("Martian does not implements Person")
    }
}

運行代碼

$ go run main.go
# 輸出如下 
Martian does not implements Person

下面我們?yōu)?Martian 實現(xiàn) Person 接口。

類型實現(xiàn)了接口

package main

import "fmt"

type Person interface {
    Name() string
    Age() int
}

type Martian struct {
}

func (m *Martian) Name() string {
    return "martian"
}

func (m *Martian) Age() int {
    return -1
}

func main() {
    // 變量必須聲明為 interface 類型
    var m interface{}
    m = &Martian{}
    if v, ok := m.(Person); ok {
        fmt.Printf("name = %s, age = %d\\n", v.Name(), v.Age())
    }
}

運行代碼

$ go run main.go
# 輸出如下 
name = martian, age = -1

從輸出的結果中可以看到,運行成功,Martian 已經(jīng)實現(xiàn)了 Person 接口的全部方法。

反射

通過 reflect 包提供的 API 來判斷類型是否實現(xiàn)了某個接口。

類型未實現(xiàn)接口

package main

import (
    "fmt"
    "reflect"
)

type Person interface {
    Name() string
    Age() int
}

type Martian struct {
}

func main() {
    // 獲取 Person 類型
    p := reflect.TypeOf((*Person)(nil)).Elem()

    // 獲取 Martian 結構體指針類型
    m := reflect.TypeOf(&Martian{})

    // 判斷 Martian 結構體類型是否實現(xiàn)了 Person 接口
    fmt.Println(m.Implements(p))
}

運行代碼

$ go run main.go
# 輸出如下 
false

下面我們?yōu)?Martian 實現(xiàn) Person 接口。

類型實現(xiàn)了接口

package main

import (
    "fmt"
    "reflect"
)

type Person interface {
    Name() string
    Age() int
}

type Martian struct {
}

func (m *Martian) Name() string {
    return "martian"
}

func (m *Martian) Age() int {
    return -1
}

func main() {
    // 獲取 Person 類型
    p := reflect.TypeOf((*Person)(nil)).Elem()

    // 獲取 Martian 結構體指針類型
    m := reflect.TypeOf(&Martian{})

    // 判斷 Martian 結構體類型是否實現(xiàn)了 Person 接口
    fmt.Println(m.Implements(p))
}

運行代碼

$ go run main.go
# 輸出如下 
true

小結

Go 的接口實現(xiàn)檢測機制分為 編譯期間運行期間,其中編譯期間的檢測方式是 接口完整性檢查, 而運行期間的檢測方式有兩種: 類型斷言反射,一般情況盡量使用類型斷言,這樣可以避免反射帶來的性能損耗。文中提到的幾種檢測方式的代碼語法都比較新 (nan) 奇 (kan) ,讀者可以參考代碼的注釋部分幫助理解。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • VaR
    VaR
    +關注

    關注

    0

    文章

    39

    瀏覽量

    11355
  • API接口
    +關注

    關注

    1

    文章

    84

    瀏覽量

    10465
  • go語言
    +關注

    關注

    1

    文章

    158

    瀏覽量

    9055
收藏 人收藏

    評論

    相關推薦

    HarmonyOS Next原生應用開發(fā)-從TS到ArkTS的適配規(guī)則(十)

    implements 規(guī)則:arkts-implements-only-iface 級別:錯誤 ArkTS不允許類被implements,只有接口可以被implements。 Type
    發(fā)表于 07-29 16:02

    150 面向對象接口 實現(xiàn)implements #硬聲創(chuàng)作季

    編程程序代碼
    充八萬
    發(fā)布于 :2023年07月26日 02:36:18

    在三相電能測量系統(tǒng)實現(xiàn)電能質(zhì)量分析的參考設計包括BOM及層圖

    描述The TIDM-THDREADING reference design implements power quality analysis in a three-phase energy
    發(fā)表于 09-10 09:02

    基于LUT的輸入處理的FPGA實現(xiàn)-應用筆記

    table (LUT). It implements a piecewise first-order linear approximation of a nonlinear function.
    發(fā)表于 09-14 21:32

    160MHz帶寬標準無線信號測試儀的IF子系統(tǒng)包括BOM及層圖

    描述This reference design implements an IF subsystem for a standard wireless signal tester
    發(fā)表于 09-18 09:05

    電壓三倍器實現(xiàn)高輸入至輸出升壓比的轉換器參考設計

    描述This boost converter implements a voltage tripler which allows a high input-to-output boost
    發(fā)表于 09-19 09:14

    簡易6LoWPAN網(wǎng)狀終端節(jié)點參考設計包括BOM及層圖

    描述This reference design implements a simple RF mesh network end node for smart meter Advanced
    發(fā)表于 10-26 10:07

    實現(xiàn)兩個小尺寸集成FET的8V-20V輸入同步降壓轉換器

    描述The PMP11225 reference design implements two small-footprint integrated FET synchronous buck
    發(fā)表于 12-06 11:51

    dspic30f5011陷入未知狀態(tài)

    嗨,AllI有一個非常困難的問題:(經(jīng)過幾天的正常工作,DSPIC30F5011卡在一個未知的狀態(tài)。只有重置可以釋放它。兩個提示:1。SW實現(xiàn)16秒看門狗,在這個問題STATE2中似乎沒有激活。SW
    發(fā)表于 05-07 12:26

    Lock體系結構和讀寫鎖機制解析

    接口之一,規(guī)定了資源鎖使用的幾個基礎方法。ReentrantLock類實現(xiàn)Lock接口的可重入鎖,即線程如果獲得當前實例的鎖,并進入任務方法,在線程沒有釋放鎖的狀態(tài)下,可以再次進入任務方法,特點:互斥
    發(fā)表于 01-05 17:53

    #HarmonyOS征文#—HarmonyOS實現(xiàn)雙擊事件

    1. 雙擊事件雙擊事件和單擊事件有些類似,也有四種實現(xiàn)的方法1.通過id找到組件。 2.給按鈕組件設置雙擊事件。 3.本類實現(xiàn)DoubleClickedListener接口重寫。 4.重寫
    發(fā)表于 07-28 10:49

    HarmonyOS實戰(zhàn)—實現(xiàn)長按事件

    實現(xiàn)案例:長按按鈕修改文本內(nèi)容新建項目:ListenerApplication3ability_main MainAbilitySlicepackage
    發(fā)表于 08-12 11:44

    使用AT89C2051微控制器實現(xiàn)簡單溫度計的設計

    The system presented in this application note implements a simple digital thermometerthat includes
    發(fā)表于 06-27 11:34 ?75次下載

    SN65LVDS387,SN75LVDS387,SN65LV

    This family of four, eight, and sixteen differential line drivers implements the electrical
    發(fā)表于 08-26 17:42 ?15次下載

    基本組合邏輯功能雙向管腳的Verilog HDL源代碼

    電子發(fā)燒友網(wǎng)核心提示: 本例程是Verilog HDL源代碼:關于基本組合邏輯功能中雙向管腳的功能實現(xiàn)源代碼。 Verilog HDL: Bidirectional Pin This example implements a clocked bidirectional p
    發(fā)表于 10-15 11:28 ?1618次閱讀
    主站蜘蛛池模板: 北条麻妃夫の友人196| 精品国产自在自线官方| 福利免费观看体检区| 国产精品99久久久久久AV下载| 国产午夜小视频| 久久九九日本韩国精品| 人人碰在线视频| 亚洲国产精品线在线观看| 51成人精品午夜福利AV免费七| 高清国产在线观看| 久久国产伦子伦精品| 亲女乱h文小兰第一次| 亚洲电影二区| gogogo免费视频观看| 国家产午夜精品无人区| 欧美高清vivoesosexo10| 亚洲不卡视频| GAY2022空少被体育生暴菊| 国产最新地址| 青青久在线视频免费观看| 亚洲色无码播放| 超碰97免费人妻| 中文无码在线观| 打开双腿狠狠蹂躏蜜桃臀| 久久精品天天爽夜夜爽| 神电影院午夜dy888我不卡| 中文字幕人成乱码熟女APP| 国产精品久久婷婷五月色| 美女胸被男子强捏视频| 亚洲薄码区| 超碰视频在线| 久久永久影院免费| 香蕉精品国产自在现线拍| 99久久99久久精品免费看子 | 亚洲 天堂 欧美 日韩 国产| 97人妻中文字幕免费视频| 果冻传媒2021一二三在线观看| 全肉高H短篇合集| 中国明星16xxxxhd| 国产一卡在线观看完整版 | 久久成人无码国产免费播放|