1.结构体、接口初体验
package main
import "fmt"
type Animal interface {
eat()
run()
}
type Cat struct {
Name string
Age int
Color string
}
func (cat Cat) eat() {
fmt.Printf("a cat is eating,it's name is %s ,age is %d\n", cat.Name, cat.Age)
}
func (cat Cat) run() {
fmt.Printf("a cat is running,it's name is %s ,age is %d\n", cat.Name, cat.Age)
}
type Dog struct {
Name string
Age int
Color string
}
func (dog Dog) eat() {
fmt.Printf("a dog is eating,it's name is %s ,age is %d\n", dog.Name, dog.Age)
}
func (dog Dog) run() {
fmt.Printf("a dog is running,it's name is %s ,age is %d\n", dog.Name, dog.Age)
}
func main() {
cat := Cat{"lucky", 2, "black"}
dog := Dog{"lalala", 1, "white"}
cat.eat()
cat.run()
dog.eat()
dog.run()
fmt.Println("a animal of cat's behavior:")
var a Animal
a = cat
a.eat()
a.run()
fmt.Println("a animal of dog's behavior:")
a = dog
a.eat()
a.run()
fmt.Println("slice of Animal behaviors:")
x := make([]Animal, 2)
x[0], x[1] = cat, dog
for _, value := range x {
value.eat()//多态
}
2.协程demo1 运行结果没有打印语句的原因是主线程都退出了 所有的协程都没有来得及执行也退出了
package main
import "fmt"
func Add(a, b int) {
c := a + b
fmt.Printf("%d + %d = %d\n", a, b, c)
}
func main() {
for i := 0; i < 10; i++ {
go Add(i, i)
}
}
3.协程demo2 在demo1的基础上引入time包让主线程睡眠1秒等待协程执行完毕
package main
import "fmt"
import "time"
func Add(a, b int) {
c := a + b
fmt.Printf("%d + %d = %d\n", a, b, c)
}
func main() {
for i := 0; i < 10; i++ {
go Add(i, i)
}
time.Sleep(1 * time.Second) //sleep 1 second
}
4.channel初体验 chan是go提供的一种通道可以代替锁实现临界区的阻塞
demo2虽然实现了功能但是事实上我们并不知道需要等待多久可以执行完。所以用channel改造一下程序。
package main
import "fmt"
func Add(a, b int, ch chan int) {
c := a + b
fmt.Printf("%d + %d = %d\n", a, b, c)
ch <- 1 //写入
}
func main() {
chs := make([]chan int, 10) //定义10个channel
for i := 0; i < 10; i++ {
chs[i] = make(chan int)
go Add(i, i, chs[i])
}
for _, v := range chs {
<-v //读取 如果数据没有写入就会阻塞
}
}
5.select初体验 结合channel实现超时
package main
import "fmt"
import "time"
func main() {
ch := make(chan int)
timeout := make(chan bool)
go func() {
time.Sleep(time.Second)
timeout <- true
}() //定义一个匿名函数 后面的括号代表立即调用
select {
case <-ch:
fmt.Println("read data from ch!")
case <-timeout:
fmt.Println("read data from ch timeout!")
}
}