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

本文通过示例展示了Go语言中如何处理函数参数传递,特别是指针引用以实现在循环中修改变量。同时,讨论了在蓝牙连接场景下,如何通过自定义回调函数监听设备连接状态,包括两种不同的实现方式。文章还引入了一个结构体方法来动态改变内部回调函数,并模拟了后台与前台状态同步的过程。
摘要由CSDN通过智能技术生成

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

不可以的

package main

import (
	"fmt"
	"time"
)

func main() {
	var num int = 4
	go m_ble_task(num)

	time.Sleep(3 * time.Second)
	num = 5
	time.Sleep(3 * time.Second)
}
func m_ble_task(conn_limit int) {
	for {
		time.Sleep(1 * time.Second)
		fmt.Println(conn_limit)
	}
}

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

4

4

4

4

4

传入地址

可以的

package main

import (
	"fmt"
	"time"
)

func main() {
	var num int = 4
	go m_ble_task(&num)

	time.Sleep(3 * time.Second)
	num = 5
	time.Sleep(3 * time.Second)
}
func m_ble_task(conn_limit *int) {
	for {
		time.Sleep(1 * time.Second)
		fmt.Println(*conn_limit)
	}
}


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

补充简单

package main

import (
	"fmt"
	"time"
)

var num int = 4

func main() {

	go m_ble_task()

	time.Sleep(3 * time.Second)
	num = 5
	time.Sleep(3 * time.Second)
}
func m_ble_task() {
	for {
		time.Sleep(1 * time.Second)
		fmt.Println(num)
	}
}


补充一个简单的方式
[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
 

package main

import (
	"fmt"
	"time"
)

/*
定义一个结构体 成员1是string 成员2是一个函数需要参数bool没有返回值
*/
type Adapter struct {
	id             string
	connectHandler func(connected bool)
}

/*
实例化一个出来 现场赋值第二个成员
*/
var DefaultAdapter = &Adapter{
	connectHandler: func(connected bool) {
		fmt.Println("connectHandler I am here")
		return
	},
}

/*
结构体绑定一个方法 它是修改里面的函数的!
*/
func (a *Adapter) SetConnectHandler(c func(connected bool)) {
	a.connectHandler = c
}
func myswap(c bool) {
	go func(b bool) {
		for {
			time.Sleep(time.Second * 2)
			fmt.Println("myswap", b)
			b = !b
		}
	}(c)
}

func main() {
	tt := true
	count := 0
	var m_adapter = DefaultAdapter
	m_adapter.id = "HCI2"
	fmt.Println(m_adapter)
	m_adapter.connectHandler(tt) //调用1
	/*
	   第一轮测试
	   &{HCI2 0x1fc6a0}
	   connectHandler I am here
	*/
	m_adapter.SetConnectHandler(func(c bool) {
		fmt.Println("new boy!")
	})
	fmt.Println(m_adapter)
	m_adapter.connectHandler(tt) //调用2
	/*
			上面是经过SetConnectHandler以后第二轮测试
			&{HCI2 0x1fc720}
		    new boy!
	*/
	m_adapter.SetConnectHandler(myswap)
	fmt.Println(m_adapter)
	m_adapter.connectHandler(tt) //调用3
	for {
		time.Sleep(time.Second)
		fmt.Println(tt)
		count++
		if count == 8 {
			break
		}
	}
	/*
		上面是经过SetConnectHandler以后第三轮测试
		myswap false
		true
		函数内的bool已经翻转 凡是不能带出来 tt不变化
		因为这里是值 不是地址
	*/
	/*
			前面的模仿没有到位
			应该是这个结构体 给一个bool标识状态 即可
			但是结构体给的不是bool 而是一个函数
			应该是后台有函数在设置的 我送bool进去

		    源码// TODO: a proper async callback.
			m_adapter.connectHandler(nil, true)


	*/
	fmt.Println("wrong--->right")
	/*后台设置函数 */
	go func() {
		b := true
		for {
			time.Sleep(time.Second * 2)
			b = !b
			fmt.Println("background", b)
			m_adapter.connectHandler(b)
		}

	}()

	/*用户设置函数 */
	m_adapter.SetConnectHandler(func(c bool) {
		tt = c
	})
	/*主程序打印 看到后台的修改 传过来了*/
	for {
		time.Sleep(time.Second)
		fmt.Println(tt)
		count++
		if count == 8 {
			break
		}
	}

}

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值