안녕하세요 바둑 새내기 여러분(아니면 고퍼 수련생이라고 해야 할까요?)! ?
인터페이스는 모두가 계속해서 이야기하는 신비스럽고 마술적인 것 중 하나처럼 보였지만 실제로는 말이 되는 방식으로 설명하는 사람이 아무도 없었습니다. “다형성과 비슷하지만 더 간단합니다.”라고 그들은 말했습니다. “그것은 마치 계약과 같다”고 그들은 주장했다. 하지만 내가 구현하려고 할 때마다 내 코드는 "무슨 짓을 하고 있는 거야, 인간?"과 같은 표정을 지었습니다. ?
하지만 그때는 그랬습니다. 이제 인터페이스와 저는 훨씬 더 나은 관계를 유지하고 있으며 초기 혼란을 방지하는 데 도움을 드리고자 왔습니다. 따라서 Go 인터페이스에 대해 머리를 긁적이었다면 커피(또는 차) 한 잔을 들고 한 번에 한 단계씩 분석해 보겠습니다. ?
그럼 인터페이스란 정확히 무엇인가요?
맨 위부터 시작해 보겠습니다. Go에서 인터페이스는 기본적으로 동작을 정의하는 방법이지만 작동 방식에 대한 세부 사항에 얽매이지 않습니다. 당신이 공장의 사장이고 기계가 어떻게 작동하는지 신경 쓰지 않는다고 상상해보십시오. 당신은 그것이 제품을 생산할 수 있다는 점만 신경 쓰면 됩니다. 이것이 바로 Go 인터페이스와 같습니다. 발생해야 할 일을 정의하지만 수행 방법은 정의하지 않습니다.
예를 들어 우리가 동물과 함께 작업한다고 가정해 보겠습니다(예, Go는 동물과 함께 작업합니다. 여기서 나와 함께 머물러 주세요). 모든 동물이 소리를낸다는 것은 알지만, 소리가 어떻게 나는지는 별로 신경쓰지 않습니다. 개는 짖고, 고양이는 짖고, 오리는… 뭐, 꽥꽥거립니다. 다음과 같이 인터페이스를 정의할 수 있습니다.
type Animal interface { Sound() string }
이건 뭐야? 다음과 같은 계약서만 있으면 됩니다. "동물이라고 부르고 싶은 모든 유형에는 Sound() 메서드가 있어야 합니다." 그게 다야! 이상한 마법이 필요하지 않습니다.
코드를 보여주세요! ???
아주 간단한 예를 들어 실제로 어떻게 작동하는지 살펴보겠습니다. 동물을 만들어서 말하게 할게요.
package main import "fmt" // The Animal interface type Animal interface { Sound() string } // Define a Dog type Dog struct{} func (d Dog) Sound() string { return "Woof!" } // Define a Cat type Cat struct{} func (c Cat) Sound() string { return "Meow!" } func main() { // Our Animal variable can hold any type that satisfies the interface var myPet Animal // myPet is now a Dog myPet = Dog{} fmt.Println(myPet.Sound()) // Outputs: Woof! // myPet is now a Cat myPet = Cat{} fmt.Println(myPet.Sound()) // Outputs: Meow! }
여기서 무슨 일이 일어나고 있나요?
여기서 Go 인터페이스의 마법이 실제로 발휘됩니다 ??:
유형에 필요한 메소드가 있으면 인터페이스를 충족합니다. "개는 동물을 구현합니다"라고 명시적으로 말할 필요가 없습니다. Go는 스스로 그것을 알아낼 만큼 똑똑합니다! ??
왜 인터페이스에 관심을 가져야 할까요?
내가 당신과 수평을 이루도록하겠습니다. 처음에는 “이런 일을 왜 귀찮게 하는 거지? 내 방법을 직접 작성할 수 있습니다!” 하지만 저를 믿으세요. 특히 코드베이스가 커지기 시작하면 인터페이스를 더 빨리 이해하고 싶을 것입니다.
이유는 다음과 같습니다.
다형성: 동일한 인터페이스를 구현하면 다양한 유형을 균일하게 처리할 수 있습니다. 이것이 바로 인터페이스를 매우 강력하게 만드는 이유입니다. 마치 모든 TV에서 작동하는 범용 리모컨을 갖는 것과 같습니다.
클린 코드: 인터페이스를 사용하면 더 깔끔하고 모듈화된 코드를 작성할 수 있습니다. 동작을 정의하고 유형이 자체 구현을 처리하도록 합니다.
다양한 방법으로 문제없습니다!
한 단계 더 발전시켜 보겠습니다. 도형 작업을 위한 시스템을 구축 중이고 원이나 직사각형과 같은 다양한 도형의 면적과 둘레를 모두 계산하려고 한다고 가정해 보겠습니다. 다중 메소드 인터페이스를 시작하세요!
type Animal interface { Sound() string }
빈 인터페이스(인터페이스{})
아, 우리가 끝났다고 생각하셨나요???? 아니요! 빈 인터페이스인 인터페이스{}에 대해 좀 더 자세히 살펴보겠습니다. 이는 Go에서 "어떤 유형이든 담을 수 있습니다."라고 말하는 방식입니다. 문자열, 숫자, 구조체 등 무엇이든 원하는 대로 넣을 수 있는 자유투 상자와 같습니다.
package main import "fmt" // The Animal interface type Animal interface { Sound() string } // Define a Dog type Dog struct{} func (d Dog) Sound() string { return "Woof!" } // Define a Cat type Cat struct{} func (c Cat) Sound() string { return "Meow!" } func main() { // Our Animal variable can hold any type that satisfies the interface var myPet Animal // myPet is now a Dog myPet = Dog{} fmt.Println(myPet.Sound()) // Outputs: Woof! // myPet is now a Cat myPet = Cat{} fmt.Println(myPet.Sound()) // Outputs: Meow! }
빈 인터페이스는 처리할 유형(예: API 또는 라이브러리)을 미리 알 수 없는 상황에서 자주 사용됩니다. Go의 와일드카드 버전과 같습니다.
인터페이스 수용
Go 인터페이스를 배우는 것은 처음에는 미로를 탐색하는 것처럼 느껴질 수 있지만 기본 사항을 이해하고 나면 유연하고 재사용 가능하며 깔끔한 코드의 완전히 새로운 세계가 열립니다. 그러니 두려워하지 말고 뛰어들어 보세요!
간단하게 시작하고, 작은 예제를 가지고 놀고, Go의 인터페이스 마법이 자라나게 하세요. 머지않아 기술 컨퍼런스에서 요가 강사처럼 깔끔하고 유연한 코드를 작성하게 될 것입니다.
고퍼스 여러분, 즐거운 코딩하세요! 인터페이스가 단순하고 구조체가 지속적으로 구현되기를 바랍니다. ?✌️
위 내용은 걱정을 멈추고 Go 인터페이스를 사랑하게 된 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!