Golang中结构体和接口的区别是什么?

Golang中结构体和接口的区别是什么? 很高兴再次来到这里 😉

我在用Golang编程时遇到一个小问题…

我不清楚结构体和接口之间的区别。

我原以为是"结构体"用于属性而"接口"用于方法,但还不太确定…

有人能给我解释一下吗?

7 回复

谢谢 😊😉

更多关于Golang中结构体和接口的区别是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢你,我现在理解接口了

基本上就是这样。

结构体通过方法定义了与行为相关的数据。

接口定义了可以由许多不同结构体实现的通用行为。但接口并不对实际数据做出任何保证。

接口定义了一组方法,这些方法将用于支持多种不同的结构体类型。这样您就可以编写适用于任何支持该接口的结构体的方法,而不仅限于特定类型的结构体。

结构体通过实现所需的方法集来实现接口。

我建议先学习官方教程来掌握基础知识:https://tour.golang.org/

接口部分从第九页开始,但前面几页讲解结构体、方法和接收器的内容对于理解接口非常有帮助。

func main() {
    fmt.Println("hello world")
}

好的,我有这段代码:

type Website struct {
   Name        string `json:"name"`
   Description string `json:"description"`
   Url         string `json:"url"`
}

var websites []Website

我之前在 JavaScript 中使用过 TypeScript,当我在 TypeScript 中使用 []Website 时,是因为 Website 是一个接口,就像我定义的这个结构体一样……那么我什么时候应该使用接口,什么时候应该使用结构体呢?

在Go语言中,结构体和接口是两种不同的类型,它们在用途和行为上有本质区别。我来详细解释并给出代码示例。

结构体(Struct)

  • 结构体是值类型,用于封装一组相关的字段(属性)
  • 可以包含字段(数据)和方法
  • 通过实例化创建具体的对象

接口(Interface)

  • 接口是抽象类型,定义了一组方法的签名
  • 只包含方法声明,不包含实现
  • 任何实现了接口所有方法的类型都自动满足该接口
package main

import "fmt"

// 结构体示例
type Person struct {
    Name string
    Age  int
}

// 结构体方法
func (p Person) Introduce() {
    fmt.Printf("我叫%s,今年%d岁\n", p.Name, p.Age)
}

// 接口定义
type Speaker interface {
    Speak() string
}

// Person实现Speaker接口
func (p Person) Speak() string {
    return fmt.Sprintf("你好,我是%s", p.Name)
}

// 另一个实现Speaker接口的类型
type Dog struct {
    Name string
}

func (d Dog) Speak() string {
    return "汪汪!"
}

func main() {
    // 结构体实例化
    person := Person{Name: "张三", Age: 25}
    person.Introduce() // 调用结构体方法
    
    // 接口使用
    var speaker Speaker
    speaker = person
    fmt.Println(speaker.Speak()) // 输出: 你好,我是张三
    
    speaker = Dog{Name: "小黑"}
    fmt.Println(speaker.Speak()) // 输出: 汪汪!
}

关键区别:

  1. 结构体定义具体的数据结构和相关方法
  2. 接口定义行为契约,不关心具体实现
  3. 结构体可以有字段,接口只能有方法签名
  4. 结构体需要显式实例化,接口通过实现隐式满足
// 接口多态示例
func MakeSound(s Speaker) {
    fmt.Println(s.Speak())
}

func main() {
    p := Person{Name: "李四"}
    d := Dog{Name: "小白"}
    
    MakeSound(p) // 输出: 你好,我是李四
    MakeSound(d) // 输出: 汪汪!
}

结构体提供具体实现,接口提供抽象契约,两者在Go中配合使用可以实现灵活的面向对象编程。

回到顶部