亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang語言漸入佳境[18]-interface接口

發布時間:2020-07-09 19:57:12 來源:網絡 閱讀:187 作者:jonson_jackson 欄目:開發技術

接口聲明與定義

interface關鍵字,在接口中有函數,但是沒有實現。

1
2
3
type Phone interface {
call()
}

例子

一旦有結構體實現了此函數,那么就可以用接口來接收此結構體。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import "fmt"

type Phone interface {
call()
}

type AndroidPhone struct {
}

type IPhone struct {
}

func (a AndroidPhone) call() {
fmt.Println("我是安卓手機,可以打電話了")
}

func (i IPhone) call() {
fmt.Println("我是蘋果手機,可以打電話了")
}

func main() {
// 定義接口類型的變量
var phone Phone
phone = new(AndroidPhone)
phone = AndroidPhone{}
fmt.Printf("%T , %v , %p \n" , phone , phone , &phone)
phone.call()

phone = new(IPhone)
phone = IPhone{}
fmt.Printf("%T , %v , %p \n" , phone , phone , &phone)
phone.call()
}

案例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package main

import "fmt"

type Income interface {
calculate() float64 //計算收入總額
source() string     //用來說明收入來源
}

//固定賬單項目
type FixedBilling struct {
projectName  string  //工程項目
biddedAmount float64 //項目招標總額
}

//定時生產項目(定時和材料項目)
type TimeAndMaterial struct {
projectName string
workHours   float64 //工作時長
hourlyRate  float64 //每小時工資率
}

//固定收入項目
func (f FixedBilling) calculate() float64 {
return f.biddedAmount
}

func (f FixedBilling) source() string {
return f.projectName
}

//定時收入項目
func (t TimeAndMaterial) calculate() float64 {
return t.workHours * t.hourlyRate
}

func (t TimeAndMaterial) source() string {
return t.projectName
}

//通過廣告點擊獲得收入
type Advertisement struct {
adName         string
clickCount     int
incomePerclick float64
}

func (a Advertisement) calculate() float64 {
return float64(a.clickCount) * a.incomePerclick
}

func (a Advertisement) source() string {
return a.adName
}

func main() {
p1 := FixedBilling{"項目1", 5000}
p2 := FixedBilling{"項目2", 10000}
p3 := TimeAndMaterial{"項目3", 100, 40}
p4 := TimeAndMaterial{"項目4", 250, 20}
p5 := Advertisement{"廣告1", 10000, 0.1}
p6 := Advertisement{"廣告2", 20000, 0.05}

ic := []Income{p1, p2, p3, p4, p5, p6}
fmt.Println(calculateNetIncome(ic))
}

//計算凈收入
func calculateNetIncome(ic []Income) float64 {
netincome := 0.0
for _, income := range ic {
fmt.Printf("收入來源:%s ,收入金額:%.2f \n", income.source(), income.calculate())
netincome += income.calculate()
}
return netincome
}

//說明:
// 沒有對calculateNetIncome函數做任何更改,盡管添加了新的收入方式。全靠多態性而起作用。
// 由于新的Advertisement類型也實現了Income接口,可以將它添加到ic切片中。
// calculateNetIncome函數在沒有任何更改的情況下工作,因為它可以調用Advertisement類型的calculate()和source()方法。

空接口

1
2
type A interface {
}

空接口可以接受任何的數據類型

1
2
3
4
5
6
7
type A interface {
}
var a1 A = Cat{"Mimi", 1}
var a2 A = Person{"Steven", "男"}
var a3 A = "Learn golang with me!"
var a4 A = 100
var a5 A = 3.14

定義map。value是任何數據類型

1
2
3
4
5
//2、定義map。value是任何數據類型
map1 := make(map[string]interface{})
map1["name"] = "Daniel"
map1["age"] = 13
map1["height"] = 1.71

定義一個切片,其中存儲任意數據類型

1
2
3
slice1 := make([]interface{}, 0, 10)
slice1 = append(slice1, a1, a2, a3, a4, a5)
fmt.Println(slice1)

完整案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package main

import (
"fmt"
)

type A interface {
}

type Cat struct {
name string
age  int
}

type Person struct {
name string
sex  string
}

func main() {
var a1 A = Cat{"Mimi", 1}
var a2 A = Person{"jonson", "男"}
var a3 A = "Learn golang with me!"
var a4 A = 100
var a5 A = 3.14

showInfo(a1)
showInfo(a2)
showInfo(a3)
showInfo(a4)
showInfo(a5)
fmt.Println("------------------")

//1、fmt.println參數就是空接口
fmt.Println("println的參數就是空接口,可以是任何數據類型", 100, 3.14, Cat{"旺旺", 2})

//2、定義map。value是任何數據類型
map1 := make(map[string]interface{})
map1["name"] = "Daniel"
map1["age"] = 13
map1["height"] = 1.71
fmt.Println(map1)
fmt.Println("------------------")

// 3、定義一個切片,其中存儲任意數據類型
slice1 := make([]interface{}, 0, 10)
slice1 = append(slice1, a1, a2, a3, a4, a5)
fmt.Println(slice1)

}


func showInfo(a A) {
fmt.Printf("%T , %v \n", a, a)
}

接口對象轉型的兩種方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//接口對象轉型方式1
//instance,ok := 接口對象.(實際類型)
func getType(s Shape) {
if instance, ok := s.(Rectangle); ok {
fmt.Printf("矩形:長度%.2f , 寬度%.2f , ", instance.a, instance.b)
} else if instance, ok := s.(Triangle); ok {
fmt.Printf("三角形:三邊分別:%.2f , %.2f , %.2f , ", instance.a, instance.b, instance.c)
} else if instance, ok := s.(Circle); ok {
fmt.Printf("圓形:半徑%.2f , ", instance.radius)
}
}

//接口對象轉型——方式2
//接口對象.(type),  配合switch和case語句使用
func getType2(s Shape) {
switch instance := s.(type) {
case Rectangle:
fmt.Printf("矩形:長度為%.2f , 寬為%.2f ,\t", instance.a, instance.b)
case Triangle:
fmt.Printf("三角形:三邊分別為%.2f ,%.2f , %.2f ,\t", instance.a, instance.b, instance.c)
case Circle:
fmt.Printf("圓形:半徑為%.2f ,\t", instance.radius)
}
}

接口對象轉型案例 求周長或者面積

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package main

import (
"math"
"fmt"
)

//1、定義接口
type Shape interface {
perimeter() float64
area() float64
}

//2.矩形
type Rectangle struct {
a, b float64
}

//3.三角形
type Triangle struct {
a, b, c float64
}

//4.圓形
type Circle struct {
radius float64
}

//定義實現接口的方法
func (r Rectangle) perimeter() float64 {
return (r.a + r.b) * 2
}

func (r Rectangle) area() float64 {
return r.a * r.b
}

func (t Triangle) perimeter() float64 {
return t.a + t.b + t.c
}

func (t Triangle) area() float64 {
//海倫公式
p := t.perimeter() / 2 //半周長
return math.Sqrt(p * (p - t.a) * (p - t.b) * (p - t.c))
}

func (c Circle) perimeter() float64 {
return 2 * math.Pi * c.radius
}

func (c Circle) area() float64 {
return math.Pow(c.radius, 2) * math.Pi
}

//接口對象轉型方式1
//instance,ok := 接口對象.(實際類型)
func getType(s Shape) {
if instance, ok := s.(Rectangle); ok {
fmt.Printf("矩形:長度%.2f , 寬度%.2f , ", instance.a, instance.b)
} else if instance, ok := s.(Triangle); ok {
fmt.Printf("三角形:三邊分別:%.2f , %.2f , %.2f , ", instance.a, instance.b, instance.c)
} else if instance, ok := s.(Circle); ok {
fmt.Printf("圓形:半徑%.2f , ", instance.radius)
}
}

//接口對象轉型——方式2
//接口對象.(type),  配合switch和case語句使用
func getType2(s Shape) {
switch instance := s.(type) {
case Rectangle:
fmt.Printf("矩形:長度為%.2f , 寬為%.2f ,\t", instance.a, instance.b)
case Triangle:
fmt.Printf("三角形:三邊分別為%.2f ,%.2f , %.2f ,\t", instance.a, instance.b, instance.c)
case Circle:
fmt.Printf("圓形:半徑為%.2f ,\t", instance.radius)
}
}

func getResult(s Shape) {
getType2(s)
fmt.Printf("周長:%.2f ,面積:%.2f \n", s.perimeter(), s.area())
}

func main() {
var s Shape
s = Rectangle{3, 4}
getResult(s)
showInfo(s)

s = Triangle{3, 4, 5}
getResult(s)
showInfo(s)

s = Circle{1}
getResult(s)
showInfo(s)

x := Triangle{3, 4, 5}
fmt.Println(x)

}

func (t Triangle) String() string {
return fmt.Sprintf("Triangle對象,屬性分別為:%.2f, %.2f, %.2f", t.a, t.b, t.c)
}

func showInfo(s Shape) {
fmt.Printf("%T ,%v \n", s, s)
fmt.Println("-------------------")
}
  • 本文鏈接: https://dreamerjonson.com/2018/11/27/golang-18-interface/

  • 版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY 4.0 CN協議 許可協議。轉載請注明出處!

golang語言漸入佳境[18]-interface接口

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

英德市| 安国市| 平南县| 阜新| 岚皋县| 壶关县| 巴林左旗| 白山市| 乌兰浩特市| 彰武县| 泾川县| 尉氏县| 吉木萨尔县| 哈密市| 辉南县| 宁陕县| 屏南县| 改则县| 桦甸市| 镇江市| 金阳县| 延安市| 东辽县| 盖州市| 邯郸市| 孝昌县| 鲁山县| 厦门市| 成武县| 宜丰县| 星子县| 东乌珠穆沁旗| 汉源县| 江陵县| 通州市| 舞阳县| 延寿县| 绥中县| 剑河县| 濮阳县| 喀喇沁旗|