Like Share Discussion Bookmark Smile

J.J. Huang   2025-03-27   Getting Started Golang 06.介面   瀏覽次數:次   DMCA.com Protection Status

Go | 介面與其他語言的差異

💬 簡介

介面是物件導向語言中的核心概念,它提供了多型的支持,使得程式碼更加靈活與擴展。然而,不同語言對於介面的設計有著不同的實現方式。在 Go 語言中,介面採用了獨特的設計,它與其他語言(如 Java、C#)的介面有顯著的不同。本文將比較 Go 介面與 Java 和 C# 中介面的主要差異,並幫助讀者更深入理解 Go 語言介面的特性。

圖片來源:Gophers


🔍 介面在 Go 語言中的特性

在 Go 語言中,介面是一種非常靈活的設計。與 Java 和 C# 不同,Go 的介面採用了隱式實現,這意味著只要型別實現了介面中的所有方法,就自動實現了該介面,而不需要顯式聲明。

👻 隱式實現

在 Go 中,介面是隱式實現的,型別不需要顯式聲明自己實現了某個介面,這樣設計能夠減少額外的冗餘程式碼。只要型別實現了介面中所要求的方法,Go 就會認為它實現了這個介面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

// 定義介面
type Speaker interface {
Speak() string
}

// 定義結構
type Person struct {
Name string
}

// 為結構實現介面
func (p Person) Speak() string {
return "Hello, my name is " + p.Name
}

func main() {
p := Person{Name: "John"}
var s Speaker = p // 隱式實現介面
fmt.Println(s.Speak())
}

📝 在這個範例中,Person 結構實現了 Speaker 介面中的 Speak 方法,無需顯式聲明,Go 語言會自動認為 Person 實現了該介面。


☕️ 介面在 Java 中的特性

在 Java 中,介面需要顯式實現,這意味著一個類別必須明確聲明它實現了某個介面。Java 使用 implements 關鍵字來標識類別是否實現了介面。

🌞 顯式實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interface Speaker {
String speak();
}

class Person implements Speaker {
String name;

Person(String name) {
this.name = name;
}

@Override
public String speak() {
return "Hello, my name is " + this.name;
}
}

public class Main {
public static void main(String[] args) {
Person p = new Person("John");
Speaker s = p;
System.out.println(s.speak());
}
}

📝 在 Java 中,Person 類別必須顯式使用 implements 關鍵字來聲明它實現了 Speaker 介面,並且需要明確覆寫 speak 方法。


✡ 介面在 C# 中的特性

C# 的介面設計與 Java 類似,也需要類別顯式地實現介面,並使用 interface 關鍵字來定義介面。C# 也使用 implements 關鍵字來標明類別實現了介面。

🌞 顯式實現

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
using System;

interface ISpeaker
{
string Speak();
}

class Person : ISpeaker
{
public string Name { get; set; }

public Person(string name)
{
Name = name;
}

public string Speak()
{
return "Hello, my name is " + Name;
}
}

class Program
{
static void Main()
{
Person p = new Person("John");
ISpeaker s = p;
Console.WriteLine(s.Speak());
}
}

📝 在 C# 中,Person 類別需要顯式實現 ISpeaker 介面,並提供 Speak 方法的具體實現。


⚖️ 主要差異

特性 Go 語言 Java C#
介面實現方式 隱式實現 顯式實現(使用 implements 關鍵字) 顯式實現(使用 implements 關鍵字)
介面方法的實現標示 無需顯式聲明,只需實現方法 顯式使用 implements 關鍵字來聲明 顯式使用 implements 關鍵字來聲明
方法名稱可見性 公開或私有均可,視方法的首字母大小寫 須使用 public 標註方法 須使用 public 標註方法

⚠️ 注意事項

  • Go 的隱式實現:Go 語言中的介面實現是隱式的,這使得程式碼更為簡潔,減少了不必要的顯式聲明。這與 Java 和 C# 中顯式的介面實現方式不同,這樣的設計能夠提高程式的可擴展性,並避免冗餘的程式碼。
  • 方法名稱的可見性:Go 的介面可以為空Go 中的空介面(interface{})不包含任何方法,因此可以接受任何型別。這使得 Go 的介面更加靈活,允許在不預先定義的方法簽名的情況下進行通用型別處理。

🎯 總結

Go 語言中的介面與其他語言(如 Java 和 C#)的介面有顯著的不同。Go 介面的隱式實現方式使得它的使用更加靈活,減少了不必要的樣板程式碼。而 Java 和 C# 中的顯式實現方式則讓開發者更明確地知道哪些方法必須實現。每種設計都有其優缺點,開發者可以根據不同需求選擇使用不同語言中的介面特性。

最後,理解 Go 中介面的隱式實現對於寫出靈活且易於維護的程式碼至關重要。

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go