佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 詳解Golang語言中的interface

詳解Golang語言中的interface

熱門標簽:網(wǎng)站排名優(yōu)化 呼叫中心市場需求 AI電銷 服務(wù)外包 地方門戶網(wǎng)站 Linux服務(wù)器 百度競價排名 鐵路電話系統(tǒng)

interface是一組method簽名的組合,interface可以被任意對象實現(xiàn),一個對象也可以實現(xiàn)多個interface。任意類型都實現(xiàn)了空interface(也就是包含0個method的interface),空interface可以存儲任意類型的值。interface定義了一組方法,如果某個對象實現(xiàn)了某個接口的所有方法,則此對象就實現(xiàn)了此接口。

go version go1.12

package main

import (
  "fmt"
)

// 定義struct
type Human struct {
  name string
  age  int
  phone string
}
type Student struct {
  Human // 匿名字段
  school string
  loan  float32
}
type Employee struct {
  Human  // 匿名字段
  company string
  money  float32
}

// Human對象實現(xiàn)SayHi()方法
func (h Human) SayHi() {
  fmt.Printf("Hi, I am %s, you can call me on %s\n", h.name, h.phone)
}

// Human對象實現(xiàn)Sing()方法
func (h Human) Sing(lyrics string) {
  fmt.Println("La la la...", lyrics)
}

// Human對象實現(xiàn)Guzzle()方法
func (h Human) Guzzle(beerStein string) {
  fmt.Println("Guzzle Guzzle Guzzle...", beerStein)
}

// Employee對象重寫SayHi()方法
func (e Employee) SayHi() {
  fmt.Printf("Hi I am %s, I work at %s. Call me on %s\n", e.name, e.company, e.phone)
}

// Student對象實現(xiàn)BorrowMoney()方法
func (s Student) BorrowMoney(amount float32) {
  s.loan += amount
}

// Employee對象實現(xiàn)SpendSalary()方法
func (e Employee) SpendSalary(amount float32) {
  e.money -= amount
}

// 定義interface,interface是一組method簽名的組合
// interface可以被任意對象實現(xiàn),一個對象也可以實現(xiàn)多個interface
// 任意類型都實現(xiàn)了空interface(也就是包含0個method的interface)
// 空interface可以存儲任意類型的值
// interface Men的3個method被Human,Student,Employee實現(xiàn),也就是這3個對象都實現(xiàn)了interface Men。即:
// interface定義了一組方法,如果某個對象實現(xiàn)了某個接口的所有方法,則此對象就實現(xiàn)了此接口。
type Men interface {
  SayHi()
  Sing(lyrice string)
  Guzzle(beerStein string)
}

// interface YoungChap的BorrowMoney() method只被Student對象實現(xiàn),也就是只有Student實現(xiàn)了YoungChap
type YoungChap interface {
  SayHi()
  Sing(song string)
  BorrowMoney(amount float32)
}

// interface ElderlyGent的SpendSalary() method只被Employee對象實現(xiàn),也就是只有Employee實現(xiàn)了ElderlyGent
type ElderlyGent interface {
  SayHi()
  Sing(song string)
  SpendSalary(amount float32)
}

func main() {
  // 定義Student類型的變量
  lucy := Student{Human{"lucy", 19, "10086"}, "tsinghua", 100.00}
  lily := Student{Human{"lily", 19, "10086"}, "tsinghua", 100.00}
  liming := Student{Human{"liming", 19, "10086"}, "tsinghua", 100.00}
  // 定義Employee類型的變量
  tom := Employee{Human{"tom", 29, "10000"}, "Google", 200.00}
  // 定義Men類型的變量i
  var i Men
  // i存儲Student
  i = lucy
  fmt.Println("This is lucy, a student:")
  i.SayHi()
  i.Sing("Happy Birthday")
  i.Guzzle("Ha ha ha...")

  // i存儲Employee
  i = tom
  fmt.Println("This is tom, an Employee:")
  i.SayHi()

  // 定義slice Men,包含Men類型元素的切片,這個slice可以被賦予實現(xiàn)了Men接口的任意結(jié)構(gòu)的對象
  fmt.Println("Let's use a slice of Men and see what happens:")
  x := make([]Men, 3)
  // 三個不同類型(不同Method)的元素,實現(xiàn)了同一個interface(Men)
  x[0], x[1], x[2] = lucy, lily, liming
  for _, value := range x {
    value.SayHi()
  }
}

函數(shù)參數(shù)

interface接口還可以作為函數(shù)參數(shù),因為interface的變量可以持有任意實現(xiàn)該interface類型的對象,我們可以通過定義interface參數(shù),讓函數(shù)接受各種類型的參數(shù)。 判斷interface變量存儲的元素的類型,目前常用的有兩種方法:Comma-ok斷言和switch測試。

go version go1.12

/**
 * interface接口作為函數(shù)參數(shù)
 * 判斷interface變量存儲的元素的類型
 */
package main

import (
  "fmt"
  "strconv"
)

// 定義Human對象
type Human struct {
  name string
  age  int 
  phone string
}

// 定義空接口
type Element interface{}

// 定義切片
type List []Element

// 定義Person對象
type Person struct {
  name string
  age int 
}

// 通過定義interface參數(shù),讓函數(shù)接受各種類型的參數(shù)
// 通過這個Method(方法),Human對象實現(xiàn)了fmt.Stringer接口
// Stringer接口是fmt.Println()的參數(shù),最終使得Human對象可以作為fmt.Println的參數(shù)被調(diào)用
func (h Human) String() string {
  return "" + h.name + " - " + strconv.Itoa(h.age) + " years - phone: " + h.phone + ">" 
}

// 通過定義interface參數(shù),讓函數(shù)接受各種類型的參數(shù)
// 通過這個Method(方法),Person對象實現(xiàn)了fmt.Stringer接口
// Stringer接口是fmt.Println()的參數(shù),最終使得Person對象可以作為fmt.Println的參數(shù)被調(diào)用
func (p Person) String() string {
  return "(name: " + p.name + " - age: " + strconv.Itoa(p.age) + " years)"
}

func main() {
  // interface作為函數(shù)的參數(shù)傳遞
  Lucy := Human{"Lucy", 29, "10086"}
  fmt.Println("This human is:", Lucy)

  list := make(List, 3)
  list[0] = 100
  list[1] = "Hello Golang!"
  list[2] = Person{"Lily", 19}

  // Comma-ok斷言
  for index, element := range list {
    // 判斷變量的類型 格式:value, ok = element(T)
    // value是interface變量的值,ok是bool類型,element是interface的變量,T是斷言的interface變量的類型
    if value, ok := element.(int); ok {
      fmt.Printf("list[%d] is an int and it's value is %d\n", index, value)
    } else if value, ok := element.(string); ok {
      fmt.Printf("list[%d] is a string and it's value is %s\n", index, value)
    } else if value, ok := element.(Person); ok {
      fmt.Printf("list[%d] is a Person and it's value is %s\n", index, value)
    } else {
      fmt.Printf("list[%d] is a different type\n", index)
    }
  }

  // switch
  for index, element := range list {
    // 注意:element.(type)語法不能在switch外的任何邏輯中使用
    switch value := element.(type) {
    case int:
      fmt.Printf("list[%d] is an int, it's value is %d\n", index, value)
    case string:
      fmt.Printf("list[%d] is a string, it's value is %s\n", index, value)
    case Person:
      fmt.Printf("list[%d] is a Person, it's value is %s\n", index, value)
    default:
      fmt.Printf("list[%d] is a differernt type", index)
    }
  }
}

以上就是詳解Golang語言中的interface的詳細內(nèi)容,更多關(guān)于Golang語言中的interface的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Golang中interface{}轉(zhuǎn)為數(shù)組的操作
  • 淺談Golang 嵌套 interface 的賦值問題
  • Golang 實現(xiàn)interface類型轉(zhuǎn)string類型
  • 解決golang 反射interface{}做零值判斷的一個重大坑
  • 基于go interface{}==nil 的幾種坑及原理分析
  • golang interface判斷為空nil的實現(xiàn)代碼
  • 使用go的interface案例實現(xiàn)多態(tài)范式操作
  • go 類型轉(zhuǎn)換方式(interface 類型的轉(zhuǎn)換)

標簽:黃山 衡水 湖南 湘潭 銅川 崇左 蘭州 仙桃

巨人網(wǎng)絡(luò)通訊聲明:本文標題《詳解Golang語言中的interface》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    南岸区| 怀安县| 津市市| 舟山市| 张家界市| 贡嘎县| 德令哈市| 当涂县| 金塔县| 江孜县| 泰安市| 凉城县| 旌德县| 东山县| 任丘市| 扎兰屯市| 芒康县| 进贤县| 安宁市| 金山区| 瑞金市| 瑞安市| 页游| 文成县| 兰溪市| 宜州市| 宜兰市| 平陆县| 广宁县| 安徽省| 永川市| 太仆寺旗| 阳山县| 宝丰县| 麻阳| 诏安县| 红桥区| 湖口县| 华蓥市| 鄂州市| 五峰|