zoukankan      html  css  js  c++  java
  • go 基础

    ...
    一个笔记链接 https://cyent.github.io/golang/method/interface_oo/

    一个接口展示链接
    https://blog.csdn.net/weixin_34204722/article/details/91929123
    package main
     
    import (
    	"fmt"
    )
     
    // 薪资计算器接口
    type SalaryCalculator interface {
    	CalculateSalary() int
    }
    // 普通挖掘机员工
    type Contract struct {
    	empId  int
    	basicpay int
    }
    // 有蓝翔技校证的员工
    type Permanent struct {
    	empId  int
    	basicpay int
    	jj int // 奖金
    }
     
    func (p Permanent) CalculateSalary() int {
    	return p.basicpay + p.jj
    }
     
    func (c Contract) CalculateSalary() int {
    	return c.basicpay
    }
    // 总开支
    func totalExpense(s []SalaryCalculator) {
    	expense := 0
    	for _, v := range s {
    		expense = expense + v.CalculateSalary()
    	}
    	fmt.Printf("总开支 $%d", expense)
    }
     
    func main() {
    	pemp1 := Permanent{1,3000,10000}
    	pemp2 := Permanent{2, 3000, 20000}
    	cemp1 := Contract{3, 3000}
    	employees := []SalaryCalculator{pemp1, pemp2, cemp1}
    	totalExpense(employees)
    }
    

      





    // from https://www.liwenzhou.com/posts/Go/09_function/
    defer 执行时机
    package main
    
    import (
    	"log"
    )
    
    func f1() int {
    	x := 5
    	defer func() {
    		x++ //修改的是x,不是返回值
    	}()
    	return x  //没有在写返回值, return x 相当于 匿名的返回值=x,执行RET时,返回值是5
    }
    
    func f2() (x int) {
    	defer func() {
    		x++
    	}()
    	return 5   //返回值x=5,defer 改的x,执行RET ,结果是6
    }
    
    func f3() (y int) {
    	x := 5
    	defer func() {
    		x++
    	}()
    	return x   //第一步 返回值 y=x=5, 第二步 defer修改x , 第三步,执行RET
    }
    func f4() (x int) {
    	defer func(x int) {
    		x++
    		log.Println("x in f4 defer func(x int)=====>",x) //1
    	}(x)
    	return 5    //第一步 x=5 , 第二步 defer 修改的是形参,不是传给匿名函数的x,第三步执行RET
    }
    
    func f5() (x int)  {
    	defer func(x int)int {
    		x++
    		log.Println("in f5 defer x ===>",x)
    		return x  //没人接受
    	}(x)
    	return 5 // 第一步 x=5 , 第二步
    }
    
    
    
    func main() {
    	log.Println(f1())
    	log.Println(f2())
    	log.Println(f3())
    	log.Println(f4())
    	log.Println(f5())
    }
    
    //2021/02/06 23:07:21 5
    //2021/02/06 23:07:21 6
    //2021/02/06 23:07:21 5
    //2021/02/06 23:07:21 x in f4 defer func(x int)=====> 1
    //2021/02/06 23:07:21 5
    //2021/02/06 23:07:21 in f5 defer x ===> 1
    //2021/02/06 23:07:21 5
    

      


    函数
    1,带返回值

     

     修改函数行为

    package main
    
    import "log"
    
    //修改了函数的行为
    func adder() func(int) int  {
    	var x = 100
    	return func(y int) int {
    		x = x + y
    		return x
    	}
    }
    
    func add(x, y int) int {
    	return x+y
    }
    
    func modadd(f func(int, int) int, m, n int) int {
    	var x = 10
    	return add(m,n)+x
    }
    
    
    func main()  {
    	ret := adder()
    	ret2 := ret(200)
    	log.Println(ret2)
    	log.Println(modadd(add,1,2))
    }
    //2021/02/06 23:49:35 300
    //2021/02/07 00:01:09 13
    

      

     //顺序输出

    package main
    
    import (
    	"fmt"
    	"sync"
    	"time"
    )
    
    func main() {
    	wg := &sync.WaitGroup{}
    	ch1 := make(chan int)
    	ch2 := make(chan int)
    
    	wg.Add(2)
    	go say1(wg, ch1, ch2)
    	go say(wg, ch2, ch1)
    
    	wg.Wait()
    	time.Sleep(1 * time.Second)
    }
    
    func say(wg *sync.WaitGroup, ch2 chan int, ch1 chan int) {
    	defer wg.Done()
    	for i := 1; i <= 5; i++ {
    		ch2 <- 2*i - 1
    		fmt.Println("gorouting say",<-ch1)
    	}
    }
    
    func say1(wg *sync.WaitGroup, ch1 chan int, ch2 chan int) {
    	defer wg.Done()
    	for i := 1; i <= 5; i++ {
    		fmt.Println("gorouting say1",<-ch2)
    		ch1 <- 2 * i
    	}
    }
    

      

     //三个goroutin 顺序打印

    package main
    
    import (
    	"fmt"
    	"sync"
    )
    
    func main() {
    	wg := &sync.WaitGroup{}
    	ch1 := make(chan int)
    	ch2 := make(chan int)
    	ch3 := make(chan int)
    
    	wg.Add(3)
    	//go say1(wg, ch1, ch2)
    	//go say(wg, ch2, ch1)
    
    	go say1(wg,ch2, ch3)
    	go say2(wg,ch3, ch1)
    	go say3(wg,ch1, ch2)
    
    	wg.Wait()
    	//time.Sleep(20 * time.Second)
    }
    
    func say1(wg *sync.WaitGroup,ch2 chan int, ch3 chan int) {
    	defer wg.Done()
    	for i := 1; i <= 5; i++ {
    		ch2 <- i
    		fmt.Println("gorouting say1", <-ch3)
    	}
    }
    
    func say2(wg *sync.WaitGroup,ch3 chan int, ch1 chan int) {
    	defer wg.Done()
    	for i := 1; i <= 5; i++ {
    		fmt.Println("gorouting say2", <-ch1)
    		ch3 <-  i
    	}
    }
    
    func say3(wg *sync.WaitGroup,ch1 chan int, ch2 chan int) {
    	defer wg.Done()
    	for i := 1; i <= 5; i++ {
    		fmt.Println("gorouting say3", <-ch2)
    		ch1 <-  i
    	}
    }
    

    stuct 中嵌套 interface

    目的==> 目的是当前结构体实例可以用所有实现了该接口的其他结构体来初始化(即使他们的属性不完全一致)

    https://my.oschina.net/xinxingegeya/blog/1560474

  • 相关阅读:
    在线教育项目-day07【添加分类前端】
    在线教育项目-day07【课程分类显示接口】
    在线教育项目-day05【实现EasyExcel对Excel操作】
    在线教育项目-day05【上传头像实现】
    在线教育项目-day05【nginx】
    在线教育项目-day05【Swagger问题】
    在线教育项目-day05【上传头像功能】
    在线教育项目-day04【路由问题】
    在线教育项目-day04【后台讲师修改功能】
    在线教育项目-day04【后台讲师添加模块】
  • 原文地址:https://www.cnblogs.com/eiguleo/p/14383490.html
Copyright © 2011-2022 走看看