Golang Go语言中菜鸟请教 interface 的使用
有 2 个 struct A B,分别有自己的 New 方法 NewA(),NewB(),并且已经实现了 interface C { Scan ()} 想通过命令行传参,在 main 方法使用的时候选择实例化 A or B 并且执行 scan()
run.go A
目前的写法是用 switch 判断,感觉不太对头,有优雅的写法吗?
switch svc {
case "A":
a := NewA()
go func(c C) {
c.Scan()
}(a)
case "B":
b := NewB()
go func(c C) {
c.Scan()
}(b)
}
Golang Go语言中菜鸟请教 interface 的使用
更多关于Golang Go语言中菜鸟请教 interface 的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
package main
import (
“fmt”
)
type C interface {
Scan()
}
type A struct{}
func NewA() *A {
return &A{}
}
func (a *A) Scan() {
fmt.Println(“A Scan”)
}
type B struct{}
func NewB() *B {
return &B{}
}
func (b *B) Scan() {
fmt.Println(“B Scan”)
}
// 工厂函数,返回不同的类型
func NewInstance(svc string) (C, error) {
switch svc {
case “A”:
return NewA(), nil
case “B”:
return NewB(), nil
default:
return nil, fmt.Errorf(“invalid service: %s”, svc)
}
}
func main() {
svc := “A” // 可以通过命令行参数获取 svc
// 通过工厂函数选择实例化对象
c, err := NewInstance(svc)
if err != nil {
fmt.Println(“Error:”, err)
return
}
// 启动并执行 Scan()
go func(c C) {
c.Scan()
}©
// 阻塞,避免主程序提前退出
select {}
}
说明:
NewInstance(svc string):通过传入的 svc 字符串来决定实例化 A 或 B ,返回 C 类型接口。
在 main 函数中,通过 NewInstance 获取具体的实例并执行 Scan() 方法。
使用 go 协程来异步执行 Scan() 方法。
通过 select{} 保证主程序不会提前退出。
这样做的好处:
通过工厂模式将实例化逻辑集中管理,避免了 switch 语句的重复使用。
如果以后需要添加更多的服务,只需在 NewInstance 函数中增加对应的 case ,而不需要修改 main 函数的核心逻辑,增加了可扩展性。
这种写法比直接使用 switch 更加优雅、清晰,并且具有更好的可扩展性。
更多关于Golang Go语言中菜鸟请教 interface 的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
虽然是 gpt 的,也感谢你
我发现根本错的地方是我的 New 方法返回了 A ,所以 main 里面实例化的 a,b 类型错了
应该返回 C 才对
func NewA() C
手动撸了个,你也可以改为 struct 方式go<br>type CmdFunc func(args)<br>const cmds = map[string]CmdFunc{<br>"A":A,<br>"B":B,<br>}<br>func A(args){<br><br>}<br>func B(args){<br><br>}<br>func main(){<br> if(len(os.args)<=2){<br> //err exit<br> }<br> cmd:=os.args(1)<br> fun,ok:=cmds[cmd]<br> if ok {<br> fun(os.args)<br> }<br>}<br>
也可以写一个容器,注册不同的类型,例如 A,B 。
传参就到容器中获取。
本质是一个 map 存取。
在Go语言中,interface
是一个非常强大且灵活的特性,它定义了一组方法签名,而不包含具体的实现。这对于编写泛型代码和进行依赖注入非常有用。作为初学者,理解interface
的使用可以从以下几个方面入手:
-
定义
interface
: 使用type
关键字定义一个interface
,并在其中声明一系列方法。例如:type Animal interface { Speak() string }
-
实现
interface
: 任何类型只要实现了interface
中声明的所有方法,就隐式地实现了该interface
。无需显式声明。type Dog struct{} func (d Dog) Speak() string { return "Woof!" }
-
使用
interface
: 可以将实现了某个interface
的类型赋值给该interface
类型的变量。func main() { var a Animal a = Dog{} fmt.Println(a.Speak()) // 输出: Woof! }
-
多态性:
interface
使得函数可以接受不同类型的参数,只要这些类型实现了相应的interface
。这大大增强了代码的灵活性和可扩展性。 -
空
interface
:interface{}
是一个空interface
,它表示任意类型。这在处理未知类型的数据时非常有用。
希望这些解释能帮助你更好地理解Go语言中的interface
。如果有更具体的问题或代码示例需要分析,请随时提问!