Go - struct{} 实现 interface{}

简介: Go - struct{} 实现 interface{}

在 Go 语言中,一个 struct 实现了某个接口里的所有方法,就叫做这个 struct 实现了该接口。

下面写一个 Demo 实现一下,先写一个 Study interface{},里面需要实现 4 个方法 Listen、Speak、Read、Write,然后再写一个 study struct{},去全部实现里面的方法,然后分享一下代码心得。

代码示例

// main.go
package main
import (
 "demo/study"
 "fmt"
)
func main() {
 name := "Tom"
 s, err := study.New(name)
 if err != nil {
  fmt.Println(err)
 }
 fmt.Println(s.Listen("english"))
 fmt.Println(s.Speak("english"))
 fmt.Println(s.Read("english"))
 fmt.Println(s.Write("english"))
}
// 输出
Tom 听 english
Tom 说 english
Tom 读 english
Tom 写 english
// study.go
package study
import "github.com/pkg/errors"
var _ Study = (*study)(nil)
type Study interface {
 Listen(msg string) string
 Speak(msg string) string
 Read(msg string) string
 Write(msg string) string
}
type study struct {
 Name string
}
func (s *study) Listen(msg string) string {
 return s.Name + " 听 " + msg
}
func (s *study) Speak(msg string) string {
 return s.Name + " 说 " + msg
}
func (s *study) Read(msg string) string {
 return s.Name + " 读 " + msg
}
func (s *study) Write(msg string) string {
 return s.Name + " 写 " + msg
}
func New(name string) (Study, error) {
 if name == "" {
  return nil, errors.New("name required")
 }
 return &study{
  Name: name,
 }, nil
}

代码解释

一、

var _ Study = (*study)(nil)

要求 *study 去实现 Study,若 Study 接口被更改或未全部实现时,在编译时就会报错。

二、

type study struct {
 Name string
}

之所以定义为私有的结构体,是因为不想在其他地方被使用,比如后面将 Name 改成 UserName 只需要在本包内修改即可。

三、

func New(name string) (Study, error) {
 if name == "" {
  return nil, errors.New("name required")
 }
 return &study{
  Name: name,
 }, nil
}

在其他地方调用 New() 使用 Study 包时,仅对外暴露了 4 个方法,别人只管调用就好了,内部实现别人无需关心。

目录
相关文章
|
5月前
|
Go
|
1月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
2月前
|
JSON 编译器 Go
Go struct
该文章详细讨论了Go语言中的结构体,包括结构体的字面形式、内存对齐和填充、字段标签的使用、结构体值的赋值和可寻址性、组合字面量的取地址特性、通过指针访问结构体字段的隐式解引用,以及结构体值的比较和类型转换。
17 3
|
2月前
|
JSON 人工智能 编译器
Go json 能否解码到一个 interface 类型的值
Go json 能否解码到一个 interface 类型的值
28 1
|
2月前
|
JSON Go 数据格式
Go实现json字符串与各类struct相互转换
文章通过Go语言示例代码详细演示了如何实现JSON字符串与各类struct之间的相互转换,包括结构体对象生成JSON字符串和JSON字符串映射到struct对象的过程。
21 0
|
4月前
|
JSON Go 数据格式
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(4)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
4月前
|
Java 编译器 Go
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(3)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
4月前
|
存储 安全 Go
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(2)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
4月前
|
Java Go 索引
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(1)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
5月前
|
Go 开发者
Golang深入浅出之-Go语言结构体(struct)入门:定义与使用
【4月更文挑战第22天】Go语言中的结构体是构建复杂数据类型的关键,允许组合多种字段。本文探讨了结构体定义、使用及常见问题。结构体定义如`type Person struct { Name string; Age int; Address Address }`。问题包括未初始化字段的默认值、比较含不可比较字段的结构体以及嵌入结构体字段重名。避免方法包括初始化结构体、自定义比较逻辑和使用明确字段选择器。结构体方法、指针接收者和匿名字段嵌入提供了灵活性。理解这些问题和解决策略能提升Go语言编程的效率和代码质量。
96 1