在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

如何實現implements ?

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

概述

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

編譯期間

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

接口完整性檢查

類型未實現接口

package main

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

type Martian struct {
}

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

    // 1. 聲明一個 _ 變量 (不使用)
    // 2. 把一個 nil 轉換為 (*Martian),然后再轉換為 Person
    // 3. 如果 Martian 沒有實現 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 并沒有實現 Person 接口,所以報錯了。下面我們為 Martian 實現 Person 接口。

類型實現了接口

package main

import "fmt"

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

type Martian struct {
}

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

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

func main() {
    // 此時 Martian 已實現了 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 已經實現了 Person 接口的全部方法。

運行期間

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

類型斷言

類型未實現接口

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

下面我們為 Martian 實現 Person 接口。

類型實現了接口

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 已經實現了 Person 接口的全部方法。

反射

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

類型未實現接口

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 結構體類型是否實現了 Person 接口
    fmt.Println(m.Implements(p))
}

運行代碼

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

下面我們為 Martian 實現 Person 接口。

類型實現了接口

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 結構體類型是否實現了 Person 接口
    fmt.Println(m.Implements(p))
}

運行代碼

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

小結

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

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

    關注

    0

    文章

    39

    瀏覽量

    11360
  • API接口
    +關注

    關注

    1

    文章

    84

    瀏覽量

    10469
  • go語言
    +關注

    關注

    1

    文章

    158

    瀏覽量

    9058
收藏 人收藏

    評論

    相關推薦

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

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

    150 面向對象接口 實現implements #硬聲創作季

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

    在三相電能測量系統實現電能質量分析的參考設計包括BOM及層圖

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

    基于LUT的輸入處理的FPGA實現-應用筆記

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

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

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

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

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

    簡易6LoWPAN網狀終端節點參考設計包括BOM及層圖

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

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

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

    dspic30f5011陷入未知狀態

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

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

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

    #HarmonyOS征文#—HarmonyOS實現雙擊事件

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

    HarmonyOS實戰—實現長按事件

    實現案例:長按按鈕修改文本內容新建項目:ListenerApplication3ability_main MainAbilitySlicepackage
    發表于 08-12 11:44

    使用AT89C2051微控制器實現簡單溫度計的設計

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

    SN65LVDS387,SN75LVDS387,SN65LV

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

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

    電子發燒友網核心提示: 本例程是Verilog HDL源代碼:關于基本組合邏輯功能中雙向管腳的功能實現源代碼。 Verilog HDL: Bidirectional Pin This example implements a clocked bidirectional p
    發表于 10-15 11:28 ?1618次閱讀
    主站蜘蛛池模板: 天天做天天爱天天综合网| 日日噜噜噜噜人人爽亚洲精品| 天天操夜夜逼| 激情五月婷婷久久| 天天看片天天操| 四虎影视在线播放| 日本护士撒尿| 尻老逼| 国语自产自拍秒拍在线视频| 你懂的在线观看网址| 美女被羞羞产奶视频网站| 色婷婷六月天| 亚洲人成电影在线| 欧美.亚洲.日本一区二区三区| 欧美日韩一区二区三区毛片| 国产热| 狠狠色噜噜狠狠狠狠黑人| 69日本xxⅹxxxxx19| 窝窝午夜在线观看免费观看 | 亚洲免费色图| 中文字幕第十页| 狠狠色噜噜狠狠狠97影音先锋| 在线色网| 日本aaaa级| 成人精品视频在线观看播放| 国产精品三级在线| 红色一级毛片| 国产拍拍拍免费视频网站| 亚洲小视频| 午夜在线播放| 午夜精品福利影院| 天天做夜夜爽| 国产成人1024精品免费| 操美女免费网站| 亚洲激情a| 天堂欧美| 国产在线97色永久免费视频| 天天看天天摸色天天综合网| 在线观看黄色网| 永久免费的拍拍拍网站| 欧亚激情偷乱人伦小说视频|