2021年6月

package main

/*
#cgo LDFLAGS: -framework CoreServices
#include <stdio.h>
#include <CoreServices/CoreServices.h>

void alert() {
    CFOptionFlags responseFlags = 0;
    CFUserNotificationDisplayAlert(20.0, 3, NULL, NULL, NULL, CFSTR("提示"), CFSTR("你有一只小毛驴,从来也不骑~~~"), CFSTR("确定"), NULL, NULL, &responseFlags);
}
*/
import "C"

func main() {
    C.alert()
}

某些平台需要 cgo支持,需要注意!!!
基本代码如下:
package main

import (
    "fmt"
    "log"

    serial "github.com/tarm/goserial"
)

func main() {
    cfg := &serial.Config{
        Name: "/dev/cu.usbserial-0001",
        Baud: 115200,
    }
    ser, err := serial.OpenPort(cfg)
    if err != nil {
        log.Fatalln(err)
    }
    defer ser.Close()

    buf := make([]byte, 1024)

    for {
        n, err := ser.Read(buf)
        if err != nil {
            log.Fatalln(err)
        }
        fmt.Println(string(buf[:n]))
        ser.Write([]byte("hello world"))
    }
}

有 stdint.h 和 inttypes.h 两个头文件,一般使用 stdint.h 就行。(其中 inttypes.h 包含了 stdint.h)

stdint.h 中定义了一些整数类型,规则如下
  int8_t, int16_t, int32_t, int64_t 表示各种长度的有符号整型数
  uin8_t, uint16_t, uint32_t, uint64_t表示各种长度的无符号整型数

定义了一些常量表示以上各类型数的最大最小值

INT8_MIN, INT8_MAX
INT16_MIN, INT16_MAX
INT32_MIN, INT32_MAX
INT64_MIN, INT64_MAX

define INT8_MIN -128

define INT16_MIN-32768

在相同输入情况下不同状态有不同行为。事件,函数调用等都可以认为是输入。

一个简易状态机,包含一个最简状态和两个输入事件,两组迁变状态。
这是一个各种形形色色的状态机化简后的最终形态。

s := false // 状态

func foo() {
    if s {
        // 当前状态,在foo事件的处理逻辑
        // 离开true状态
        // 进入false状态
        s = false
    } else {
        // 当前状态,在foo事件的处理逻辑
        // 离开false状态
        // 进入true状态
        s = true
    }
}

func fee() {
    if s {
        // 当前状态,在fee事件的处理逻辑
        // 离开true状态
        // 进入false状态
        s = false
    } else {
        // 当前状态,在fee事件的处理逻辑
        // 离开false状态
        // 进入true状态
        s = true
    }
}