Go基础:基本框架

185 阅读1分钟

「本文正在参加金石计划

前言

本文旨在于通过一段简短的程序梳理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() 是它的唯一方法。然后定义了两个结构体类型 StudentTeacher,它们都实现了 Greet() 方法。 StudentTeacher 都有一个名为 name 的字符串字段。

main() 函数中,我们创建了一个 gs 变量,它是一个包含了 StudentTeacher 实例的 []Greeter 切片。接着调用了 Start() 函数,将 gs 作为参数传入。 Start() 函数启动了一个多线程的循环,在每个线程中调用 Greeter 实例的 Greet() 方法,并将返回值发送到 msg 通道中。最后,在主线程中使用 for 循环读取 msg 通道中的消息,并打印出来。

框架目录

  1. 「变量」与「函数」

    var msg chan string
    l := len(gs)
    msg = make(chan string, l)
    

    func Start(gs []Greeter) { ... }
    
  2. 「结构体」

    type Student struct{ ... }
    type Teacher struct{ ... }
    
  3. 「自定义类型」

  4. 「类型系统」

  5. 「接口」

    type Greeter interface { ... }
    
  6. 「协程」

    func main(){ ... }
    go func(g Greeter) { ... }( ... )
    

——本文属于个人学习后的个人总结,肯定会有的地方不准确,读者可以以批判思维进行阅读,如有不符合或疑惑,都可以在评论区留言