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

  • 相关阅读:
    02 _ 该如何选择消息队列
    封装、抽象、继承、多态分别可以解决哪些编程问题?
    04 _ 理论一:当谈论面向对象的时候,我们到底在谈论什么?
    03 _ 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
    接口使用
    结构体和方法
    通道的高级玩法
    通道的基本操作
    极客时间 mp3提取
    iOS多线程中的单例
  • 原文地址:https://www.cnblogs.com/eiguleo/p/14383490.html
Copyright © 2011-2022 走看看