在Go中调用另一个包中的函数-time回调

在Go中调用另一个包中的函数-time回调,第1张

写一个A.go文件    别的B.go文件 调用A.go的函数

注意:函数必须首字母大写  大写表示public

 A.go如下

package watchdog

import (
	"time"
)

type Watchdog struct {
	interval time.Duration
	timer    *time.Timer
}

func New(interval time.Duration, callback func()) *Watchdog {
	w := Watchdog{
		interval: interval,
		timer:    time.AfterFunc(interval, callback),
	}
	return &w
}

func (w *Watchdog) Stop() {
	w.timer.Stop()
}
func (w *Watchdog) Reset() {
	w.timer.Reset(w.interval)
}
func (w *Watchdog) Feed() {
	w.timer.Stop()
	w.timer.Reset(w.interval)
}

它主要的任务是 创建一个回调 就是过多少时间以后做一个什么事情!

 

package main

import (
	"log"
	"time"
	"test/watchdog"
)

func main() {
	scan_wdg_triggered := false
	count := 0
	scan_wdg := watchdog.New(time.Second*10, func() { scan_wdg_triggered = true })
	for {
		time.Sleep(time.Second)
		count = count + 1
		log.Printf("count %d--%d\r\n", count, scan_wdg_triggered)
		if count == 5 {
			scan_wdg.Feed()
		}
	}

}

调用 需要使用的是  mod

需要的是

把A.go文件放在文件夹里面!名字无所谓 因为是根据    "test/watchdog"

流程:

go mod init test

就出来了 

go mod tidy 它是去下载文件的 出来的go sum 不要理会

-------我们的-----

module test

go 1.17
-------我们的-----

我们要自己文件 本地修改 就替换一下

自己修改文件了

module mcubemems.com/m_izar_rpi_gw

go 1.16

require (
    github.com/fsnotify/fsnotify v1.5.1
    github.com/gorilla/websocket v1.4.2
    github.com/spf13/viper v1.9.0
    tinygo.org/x/bluetooth v0.3.0
)

replace tinygo.org/x/bluetooth v0.3.0 => ./bluetooth_mcube

解释一下代码 时间到了回调函数 本质是

https://pkg.go.dev/time#AfterFunc

我们大可不必写的这么复杂!!!!

go自己完成的 时间到了 去干啥 但是官方说了 还是好些

继续 前面是一个main+一个文件夹

如果和main.go平级的文件夹有其他。go呢?

我们是这样的 它的名字可以是B.go 但是内部是package main


package main

import (
	"log"

	"tinygo.org/x/bluetooth/rawterm"
)

var getNACKfromKeyboard bool = false
var getDisconnFromKeyboard bool = false
var getTimeoutFromKeyboard bool = false
var getNoACKFromKeyboard bool = false
var getLossACKFromKeyboard bool = false
var getMoreACKFromKeyboard bool = false
var exitSystem bool = false

func keyboardDebugging() {
	rawterm.Configure()
	defer rawterm.Restore()
	for {
		ch := rawterm.Getchar()
		if ch == '\x18' {
			log.Printf("get Ctrl-X, system exit\r\n")
			exitSystem = true
			break
		}
		if ch == 'd' { //for debug
			log.Printf("get Disconnect from keyboard\r\n")
			getDisconnFromKeyboard = true
		}
		if ch == 'n' { // for debug use
			log.Printf("get NACK from keyboard\r\n")
			getNACKfromKeyboard = true
		}
		if ch == 't' {
			log.Printf("get Timeout set from keyboard\r\n")
			getTimeoutFromKeyboard = true
		}
		if ch == 'a' {
			log.Printf("get No ACK from keyboard\r\n")
			getNoACKFromKeyboard = true
		}
		if ch == 'l' {
			log.Printf("get Loss ACK from keyboard\r\n")
			getLossACKFromKeyboard = true
		}
		if ch == 'm' {
			log.Printf("get More ACK from keyboard\r\n")
			getMoreACKFromKeyboard = true
		}
	}
}

这样我们在上面的main修改一下

直接run不可以   因为我们有依赖github

不可以直接run 因为main是分开的 需要2个go

 

 

package main

import (
	"log"
	"time"
	"test/watchdog"
)

func main() {
	scan_wdg_triggered := false
	count := 0
	scan_wdg := watchdog.New(time.Second*10, func() { scan_wdg_triggered = true })
    
    go keyboardDebugging() // press keyboard to set some debug flags
	for {
		time.Sleep(time.Second)
		count = count + 1
		log.Printf("count %d--%d\r\n", count, scan_wdg_triggered)
		if count == 5 {
			scan_wdg.Feed()
		}
        
        if exitSystem {
			return
		}
	}

}

 

运行效果是 键盘按下 d n 什么的可以看LOG

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/994788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存