当前位置:   article > 正文

Go编程程序传参的控制/值和址_go func传参

go func传参

案例 运行任务 传一个参数进去 这个任务时死循环 希望running的时候还可以修改这个参数

不可以的

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. var num int = 4
  8. go m_ble_task(num)
  9. time.Sleep(3 * time.Second)
  10. num = 5
  11. time.Sleep(3 * time.Second)
  12. }
  13. func m_ble_task(conn_limit int) {
  14. for {
  15. time.Sleep(1 * time.Second)
  16. fmt.Println(conn_limit)
  17. }
  18. }

[Running] go run "c:\Users\Koson.Gong\Desktop\sgo\pack.go"

4

4

4

4

4

传入地址

可以的

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. var num int = 4
  8. go m_ble_task(&num)
  9. time.Sleep(3 * time.Second)
  10. num = 5
  11. time.Sleep(3 * time.Second)
  12. }
  13. func m_ble_task(conn_limit *int) {
  14. for {
  15. time.Sleep(1 * time.Second)
  16. fmt.Println(*conn_limit)
  17. }
  18. }
  19. [Running] go run "c:\Users\Koson.Gong\Desktop\sgo\pack.go"
  20. 4
  21. 4
  22. 4
  23. 5
  24. 5

补充简单

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. var num int = 4
  7. func main() {
  8. go m_ble_task()
  9. time.Sleep(3 * time.Second)
  10. num = 5
  11. time.Sleep(3 * time.Second)
  12. }
  13. func m_ble_task() {
  14. for {
  15. time.Sleep(1 * time.Second)
  16. fmt.Println(num)
  17. }
  18. }


补充一个简单的方式
[Running] go run "c:\Users\Koson.Gong\Desktop\sgo\pack.go"
4
4
5
5
5

全局变量

我的操作时

ota.Mask = 0  --关闭了
for {
    if (len(connected) < *conn_limit) && (len(connected) < ota.Mask) {  在使用的时候变化
Mask = 100 还原出去

+++++++继续

问题:树莓派做蓝牙主机 连接从机时候 以后 断开时从机的行为
不是树莓派主机主动去断开的
目前没有断开的回调函数(可以考虑自己开发)
那么我需要一个任务去监听断开(先这么做吧)

补充一个案例:主机-扫描-连接--打印连接状态
方式1 台湾
AA-------
func ble_on_disconnect(a *bluetooth.Adapter, result bluetooth.ScanResult, c chan bool) {
    for {
        connected, _ := a.Connected(result.Address)
        if !connected {
            log.Printf("[BLE][%s] on disconnected\r\n", parse_MAC(result))
            c <- false // ble disconnect
            return
        }
        time.Sleep(500 * time.Millisecond)
    }
}
BB-----mian里面
    ble_close := make(chan bool, 1) 
    go ble_on_disconnect(adapter, result, ble_close) 
    select {
    case <-ble_close:
        打印连接状态
        break
        
        
也即是做了一个死循环轮询 一个通道返回消息
        
   接口是自己写的
D:\QMDownload\bluetooth_mcube\gap_linux.go   
func (a *Adapter) Connected(address Addresser) (bool, error) {
    adr := address.(Address)
    devicePath := dbus.ObjectPath(string(a.adapter.Path()) + "/dev_" + strings.Replace(adr.MAC.String(), ":", "_", -1))
    dev, err := device.NewDevice1(devicePath)
    if err != nil {
        return false, err
    }
    return dev.Properties.Connected, nil
}

        

方式2  参考:LED的代码
    func main() {
    println("starting")

    led.Configure(machine.PinConfig{Mode: machine.PinOutput})
    neo.Configure(machine.PinConfig{Mode: machine.PinOutput})
    ws = ws2812.New(neo)

    adapter.SetConnectHandler(func(d bluetooth.Addresser, c bool) {
        connected = c

        if !connected && !disconnected {
            clearLEDS()
            disconnected = true
        }

        if connected {
            disconnected = false
        }
    })
   
它的意思是这样的 
2个全局变量
其中disconnected一直是我自己控制
另外一个connected一直不归我自己控制  而是丢给后台 让程序自己控制
一开始两个都是0 进到第一个if所以disconnected=1标识没有连接
一旦连接 也就是后台程序设置了 connected=1 我进第二个if disconnected=0
再次断开连接 那就近代第一个if


关注一个和后台的桥梁回调函数 SetConnectHandler
 

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. /*
  7. 定义一个结构体 成员1string 成员2是一个函数需要参数bool没有返回值
  8. */
  9. type Adapter struct {
  10. id string
  11. connectHandler func(connected bool)
  12. }
  13. /*
  14. 实例化一个出来 现场赋值第二个成员
  15. */
  16. var DefaultAdapter = &Adapter{
  17. connectHandler: func(connected bool) {
  18. fmt.Println("connectHandler I am here")
  19. return
  20. },
  21. }
  22. /*
  23. 结构体绑定一个方法 它是修改里面的函数的!
  24. */
  25. func (a *Adapter) SetConnectHandler(c func(connected bool)) {
  26. a.connectHandler = c
  27. }
  28. func myswap(c bool) {
  29. go func(b bool) {
  30. for {
  31. time.Sleep(time.Second * 2)
  32. fmt.Println("myswap", b)
  33. b = !b
  34. }
  35. }(c)
  36. }
  37. func main() {
  38. tt := true
  39. count := 0
  40. var m_adapter = DefaultAdapter
  41. m_adapter.id = "HCI2"
  42. fmt.Println(m_adapter)
  43. m_adapter.connectHandler(tt) //调用1
  44. /*
  45. 第一轮测试
  46. &{HCI2 0x1fc6a0}
  47. connectHandler I am here
  48. */
  49. m_adapter.SetConnectHandler(func(c bool) {
  50. fmt.Println("new boy!")
  51. })
  52. fmt.Println(m_adapter)
  53. m_adapter.connectHandler(tt) //调用2
  54. /*
  55. 上面是经过SetConnectHandler以后第二轮测试
  56. &{HCI2 0x1fc720}
  57. new boy!
  58. */
  59. m_adapter.SetConnectHandler(myswap)
  60. fmt.Println(m_adapter)
  61. m_adapter.connectHandler(tt) //调用3
  62. for {
  63. time.Sleep(time.Second)
  64. fmt.Println(tt)
  65. count++
  66. if count == 8 {
  67. break
  68. }
  69. }
  70. /*
  71. 上面是经过SetConnectHandler以后第三轮测试
  72. myswap false
  73. true
  74. 函数内的bool已经翻转 凡是不能带出来 tt不变化
  75. 因为这里是值 不是地址
  76. */
  77. /*
  78. 前面的模仿没有到位
  79. 应该是这个结构体 给一个bool标识状态 即可
  80. 但是结构体给的不是bool 而是一个函数
  81. 应该是后台有函数在设置的 我送bool进去
  82. 源码// TODO: a proper async callback.
  83. m_adapter.connectHandler(nil, true)
  84. */
  85. fmt.Println("wrong--->right")
  86. /*后台设置函数 */
  87. go func() {
  88. b := true
  89. for {
  90. time.Sleep(time.Second * 2)
  91. b = !b
  92. fmt.Println("background", b)
  93. m_adapter.connectHandler(b)
  94. }
  95. }()
  96. /*用户设置函数 */
  97. m_adapter.SetConnectHandler(func(c bool) {
  98. tt = c
  99. })
  100. /*主程序打印 看到后台的修改 传过来了*/
  101. for {
  102. time.Sleep(time.Second)
  103. fmt.Println(tt)
  104. count++
  105. if count == 8 {
  106. break
  107. }
  108. }
  109. }

 

这个是后台传给前台---给的是api函数

本文前面我们把数据传进去 是前台传给后台

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/206300
推荐阅读
相关标签
  

闽ICP备14008679号