「本文正在参加金石计划」
前言
本文旨在于通过一段简短的程序梳理Go中的基础知识,因此推荐读者搭配与Go的相关书籍进行阅读。再次也希望读者能够通过此文章产生自己的思考,并且也欢迎你们在评论区发表建议!如有不足,作者将会悉数倾听!
一段Go程序
package main
import "fmt"
// 接口
type Greeter interface {
Greet() string
}
// 结构体
type Student struct {
name string
}
//方法
func (s Student) Greet() string {
return fmt.Sprintf("老师早上好!我是%s!", s.name)
}
type Teacher struct {
name string
}
//方法
func (t Teacher) Greet() string {
return fmt.Sprintf("早上好!我是你们的新老师%s", t.name)
}
//变量
var msg chan string
// 函数
func Start(gs []Greeter) { //未命名类型
l := len(gs)
msg = make(chan string, l)
for i := range gs {
//多线程、匿名函数
go func(g Greeter) {
// o, ok := gs[i].(Greeter)
o, ok := g.(Greeter)
if !ok {
panic("这个实例不会打招呼")
} else {
msg <- o.Greet()
}
}(gs[i])
}
}
func main() {
var gs = []Greeter{
Student{name: "Alice"},
Student{name: "Jack"},
Student{name: "Tom"},
Teacher{name: "Ashe"}}
Start(gs)
for i := 0; i < len(gs); i++ {
fmt.Println(<-msg)
}
}
这段代码定义了一个接口 Greeter,其中 Greet() 是它的唯一方法。然后定义了两个结构体类型 Student 和 Teacher,它们都实现了 Greet() 方法。 Student 和 Teacher 都有一个名为 name 的字符串字段。
在 main() 函数中,我们创建了一个 gs 变量,它是一个包含了 Student 和 Teacher 实例的 []Greeter 切片。接着调用了 Start() 函数,将 gs 作为参数传入。 Start() 函数启动了一个多线程的循环,在每个线程中调用 Greeter 实例的 Greet() 方法,并将返回值发送到 msg 通道中。最后,在主线程中使用 for 循环读取 msg 通道中的消息,并打印出来。
框架目录
-
var msg chan string l := len(gs) msg = make(chan string, l)与
func Start(gs []Greeter) { ... } -
type Student struct{ ... } type Teacher struct{ ... } -
「自定义类型」
-
「类型系统」
-
「接口」
type Greeter interface { ... } -
「协程」
func main(){ ... } go func(g Greeter) { ... }( ... )
——本文属于个人学习后的个人总结,肯定会有的地方不准确,读者可以以批判思维进行阅读,如有不符合或疑惑,都可以在评论区留言