Что может язык Go?
Привет всем, я Хороший Парень, автор буклета манги на языке Go. На этот раз я хочу поделиться с вами некоторыми сведениями о языке Go. Для программиста в эту эпоху овладение технологией похоже на совершенствование хороших боевых искусств, не только благодаря постоянному практическому опыту, но и достаточному энтузиазму, шаг за шагом, чтобы достичь царства мастера. Как среди множества языков разработки найти читбук по боевым искусствам, подходящий для вашей собственной практики? Тогда вы должны знать язык. Зная его силу, вы можете лучше понять его, и он не за горами, чтобы стать мастером.
Как внутренний язык, насколько мощным может быть язык Go, что он может делать и какие шаги он может предпринять, чтобы привлечь вас к его изучению? Тогда я просто покажу несколько трюков, и я надеюсь, что вы, ребята, дадите мне несколько советов!
компьютерное зрение
OpenCV — это кроссплатформенная библиотека программного обеспечения для компьютерного зрения и машинного обучения, выпущенная под лицензией BSD (с открытым исходным кодом) и может работать в операционных системах Linux, Windows, Android и Mac OS. Реализовано множество общих алгоритмов обработки изображений и компьютерного зрения.
OpenCV написан на языке C++, имеет интерфейсы C++, Python, Java и MATLAB и поддерживает ОС Windows, Linux, Android и Mac. Поддержка — gocv.https://gocv.io/
- установить gocv
go get -u -d gocv.io/x/gocv
- Установите MinGW-W64
https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.3.0/
- Установите CMake
https://cmake.org/download/
- Установите и скомпилируйте gocv
chdir %GOPATH%\src\gocv.io\x\gocv win_build_opencv.cmd
gocv бинаризирует изображение
package main
import (
"gocv.io/x/gocv"
)
//测试示例
func main() {
filename := "test.png"
window := gocv.NewWindow("Hello")
img := gocv.IMRead(filename, gocv.IMReadColor)
destImage := gocv.NewMat()
//二值化 转为灰度图
gocv.CvtColor(img, &destImage, gocv.ColorBGRToGray)
for {
window.IMShow(destImage)
if window.WaitKey(1) >= 0 {
break
}
}
}
распознавание лиц в gocv
package main
import (
"fmt"
"image"
"image/color"
"os"
"gocv.io/x/gocv"
)
func main() {
if len(os.Args) < 3 {
fmt.Println("How to run:\n\tfacedetect [camera ID] [classifier XML file]")
return
}
// parse args
deviceID := os.Args[1]
xmlFile := os.Args[2]
// open webcam
webcam, err := gocv.OpenVideoCapture(deviceID)
if err != nil {
fmt.Printf("error opening video capture device: %v\n", deviceID)
return
}
defer webcam.Close()
// open display window
window := gocv.NewWindow("Face Detect")
defer window.Close()
// prepare image matrix
img := gocv.NewMat()
defer img.Close()
// color for the rect when faces detected
blue := color.RGBA{0, 0, 255, 0}
// load classifier to recognize faces
classifier := gocv.NewCascadeClassifier()
defer classifier.Close()
if !classifier.Load(xmlFile) {
fmt.Printf("Error reading cascade file: %v\n", xmlFile)
return
}
fmt.Printf("Start reading device: %v\n", deviceID)
for {
if ok := webcam.Read(&img); !ok {
fmt.Printf("Device closed: %v\n", deviceID)
return
}
if img.Empty() {
continue
}
// detect faces
rects := classifier.DetectMultiScale(img)
fmt.Printf("found %d faces\n", len(rects))
// draw a rectangle around each face on the original image,
// along with text identifing as "Human"
for _, r := range rects {
gocv.Rectangle(&img, r, blue, 3)
size := gocv.GetTextSize("Human", gocv.FontHersheyPlain, 1.2, 2)
pt := image.Pt(r.Min.X+(r.Min.X/2)-(size.X/2), r.Min.Y-2)
gocv.PutText(&img, "Human", pt, gocv.FontHersheyPlain, 1.2, blue, 2)
}
// show the image in the window, and wait 1 millisecond
window.IMShow(img)
if window.WaitKey(1) >= 0 {
break
}
}
}
гобот робот
gobot — это инфраструктура IoT, написанная на Go для роботов, дронов и Интернета вещей.https://gobot.io/
- Поддерживает 35 различных платформ.
- Поддерживает связь устройств ввода/вывода (GPIO).
- Драйвер аналогового ввода-вывода (AIO).
- I2C-драйвер.
- SPI-драйвер.
малиновый пирог
Китайское имя Малины Пи树莓派
сокращен какRPi
Только мини-компьютеры размером с кредитную карту, их системы на базе Linux, это миниатюрная материнская плата для ПК на базе ARM. Для клавиатуры, мыши и сетевого кабеля основные функции ПК. Последняя версия Raspberry Pi 4B имеет память 4G, введение USB 3.0, поддержку двойного выхода 4K, ускорение процессора и графического процессора.
Программа Go, работающая на Raspberry Pi, реализует робота-танка.
package drivers
// import "fmt"
type Motor struct {
PWMA int
AIN1 int
AIN2 int
BIN1 int
BIN2 int
PWMB int
Driver *PCA9685Driver
Debug bool
}
type MotorPosition int
const (
MotorPosition_Left MotorPosition = 0
MotorPosition_Right MotorPosition = 1
MotorPosition_All MotorPosition = -1
)
type MotorDirection int
const (
MotorDirection_Forward MotorDirection = 1
MotorDirection_Backward MotorDirection = -1
)
func NewMotor(driver *PCA9685Driver) *Motor {
motor := &Motor{
PWMA: 0,
AIN1: 1,
AIN2: 2,
BIN1: 3,
BIN2: 4,
PWMB: 5,
Driver: driver,
Debug: false,
}
var PWM float32 = 125
// fmt.Println("设置电机PWM速率:", PWM)
driver.SetPWMFreq(PWM)
return motor
}
// 前进
func (this *Motor) Forward(speed int) {
this.Run(MotorPosition_All, MotorDirection_Forward, speed)
}
//后退
func (this *Motor) Backward(speed int) {
this.Run(MotorPosition_All, MotorDirection_Backward, speed)
}
//左转,原地转向
func (this *Motor) Left(speed int) {
this.Run(MotorPosition_Left, MotorDirection_Backward, speed)
this.Run(MotorPosition_Right, MotorDirection_Forward, speed)
}
//右转,原地转向
func (this *Motor) Right(speed int) {
this.Run(MotorPosition_Right, MotorDirection_Backward, speed)
this.Run(MotorPosition_Left, MotorDirection_Forward, speed)
}
//直接操作电机运转
func (this *Motor) Run(motor MotorPosition, direction MotorDirection, speed int) {
if speed > 100 {
speed = 100
}
//同时操作所有电机
if motor == MotorPosition_All {
this.Run(MotorPosition_Left, direction, speed)
this.Run(MotorPosition_Right, direction, speed)
return
}
//设置默认PWM调速通道为电机a的调速通道
pwmChannel := this.PWMA
//设置默认操作电机为A
PIN1 := this.AIN1
PIN2 := this.AIN2
//根据参数设置操作电机和调速通道为电机B
if motor == MotorPosition_Right {
pwmChannel = this.PWMB
PIN1 = this.BIN1
PIN2 = this.BIN2
}
//如果参数为后退,翻转PIN1和PIN2的位置
if direction == MotorDirection_Backward {
PIN1, PIN2 = PIN2, PIN1
}
// fmt.Println("pwmChannel:", pwmChannel, ",speed:", speed, ",PIN1:", PIN1, ",PIN2:", PIN2)
//设置速度
this.Driver.SetPWM(pwmChannel, 0, uint16(speed*(4096/100)))
//设置正电极
this.Driver.SetPWM(PIN1, 0, 4095)
//设置负电极
this.Driver.SetPWM(PIN2, 0, 0)
}
// func (this *Motor) SetPWM(channel int, on uint16, off uint16) (err error) {
// this.Driver
// if _, err := p.connection.Write([]byte{byte(PCA9685_LED0_ON_L + 4*channel), byte(on), byte(on >> 8), byte(off), byte(off >> 8)}); err != nil {
// return err
// }
// return
// }
func (this *Motor) MotorStop(motor MotorPosition) {
if motor == MotorPosition_All {
this.MotorStop(MotorPosition_Left)
this.MotorStop(MotorPosition_Right)
return
}
//设置默认PWM调速通道为电机a的调速通道
pwmChannel := this.PWMA
if motor == MotorPosition_Right {
pwmChannel = this.PWMB
}
//设置速度
this.Driver.SetPWM(pwmChannel, 0, 0)
}
package core
import (
"fmt"
"gobot.io/x/gobot"
"airobot/robot/drivers"
"gobot.io/x/gobot/platforms/raspi"
)
//机器人主结构,存储gobot实例和各个初始化的驱动以及操作器
type Robot struct {
//gobot实例
gobot *gobot.Robot
//主板适配器
adaptor *raspi.Adaptor
//电机操作板驱动
motorDriver *drivers.PCA9685Driver
//电机操作器
motor *drivers.Motor
//电机操作指令列队
motorCmds chan (*CMDData)
}
//初始化机器人监听
func (this *Robot) Start() {
this.motorCmds = make(chan (*CMDData), 100)
go this.listenMotorCmds()
}
func (this *Robot) listenMotorCmds() {
m := NewMotor(this)
wait:
cmd := <-this.motorCmds
m.execute(cmd)
goto wait
}
//机器人状态通道,用于通知webapi启动,启动过程中通道会压入0,启动完成后压入1.
var RobotState = make(chan int, 1)
//机器人操作指令主通道,通过websocket接收指令并压入此通道
var RobotCMD = make(chan *CMD, 100)
//全局机器人实例
var bot *Robot
//机器人启动方法
func StartRobot() {
bot = &Robot{}
fmt.Println("机器人开始启动.")
RobotState <- 0
fmt.Println("初始化主板适配器.")
bot.adaptor = raspi.NewAdaptor()
fmt.Println("初始化电机驱动.")
bot.motorDriver = drivers.NewPCA9685Driver(bot.adaptor)
bot.Start()
work := func() {
fmt.Println("初始化电机操作器.")
bot.motor = drivers.NewMotor(bot.motorDriver)
// var PWM float32 = 125
// fmt.Println("设置电机PWM速率:", PWM)
// bot.motorDriver.SetPWMFreq(PWM)
fmt.Println("机器人启动完成.")
fmt.Println("机器人开始等待指令.")
RobotState <- 1
begin:
cmd := <-RobotCMD
// fmt.Println("接收到指令:", cmd)
switch cmd.Channel {
case "motor":
bot.motorCmds <- &cmd.Data
break
}
goto begin
}
robot := gobot.NewRobot("tankBot",
[]gobot.Connection{bot.adaptor},
[]gobot.Device{bot.motorDriver},
work,
)
robot.Start()
}
Сервис живого видео
livego — это простой и эффективный живой сервер, написанный на чистом языке go.https://github.com/gwuhaolin/livego
- Поддерживаемые транспортные протоколы
RTMP
,AMF
,HLS
,HTTP-FLV
- Поддерживаемые форматы контейнеров
FLV
,TS
- Поддерживаемые форматы кодирования
H264
,AAC
,MP3
использовать
- 1 Запустите службу: запустите двоичный файл livego, чтобы запустить службу livego;
- 2 посещенияhttp://localhost:8090/control/get?room=movieПолучите ключ канала комнаты (ключ канала используется для потоковой передачи, фильм используется для воспроизведения).
- 3 Push-поток: отправка видеопотока на адрес rtmp://localhost:1935/{appname}/{channelkey} по протоколу RTMP (имя приложения по умолчанию активно)
Например:使用 ffmpeg -re -i demo.flv -c copy -f flv
rtmp://localhost:1935/{appname}/{channelkey} 推流(下载demo flv);
Воспроизведение: поддерживает различные протоколы воспроизведения, адрес воспроизведения выглядит следующим образом: RTMP: rtmp://localhost: 1935/{имя приложения}/фильм FLV:http://127.0.0.1:7001/{appname}/movie.flv HLS:http://127.0.0.1:7002/{appname}/movie.m3u8
//ffmpeg命令 推流
ffmpeg -re -i demo.flv -c copy -f flv rtmp://localhost:1935/{appname}/{channelkey}
Адрес документа:https://github.com/gwuhaolin/livego/blob/master/README_cn.md
Запланированные задачи CRON
Язык Go поддерживает задачи синхронизации cron.https://github.com/jakecoffman/cron
package main
import (
"fmt"
"github.com/jakecoffman/cron"
)
func main() {
c := cron.New()
//每天早上6点执行Testfun函数
c.AddFunc("0 0 6 * * ? ", Testfunc, "定时任务")
c.Start()
}
func Testfunc() {
fmt.Println("定时任务")
//TODO 处理逻辑....
}
Excelize языковая версия API документов Excel
Базовая библиотека для работы с документами Office Excel, написанными на языке Go, на основе международного стандарта ECMA-376, ISO/IEC 29500. Его можно использовать для чтения и записи электронных таблиц, созданных с помощью Microsoft Excel™ 2007 и более поздних версий. Поддерживает несколько форматов документов, таких как XLSX / XLSM / XLTM, обладает высокой совместимостью с документами со сложными компонентами, такими как стили, изображения (таблицы), сводные таблицы, слайсеры и т. д., а также предоставляет API для потокового чтения и записи.
- Адрес документа:
https://xuri.me/excelize/zh-hans/
- адрес проекта:
https://github.com/360EntSecGroup-Skylar/excelize
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize"
)
func main() {
f := excelize.NewFile()
// 创建一个 sheet
index := f.NewSheet("Sheet1")
// 设置值
f.SetCellValue("Sheet2", "A2", "Hello world.")
f.SetCellValue("Sheet1", "B2", 100)
// 设置工作簿的活动工作表。
f.SetActiveSheet(index)
// 保存excel
if err := f.SaveAs("Book1.xlsx"); err != nil {
fmt.Println(err)
}
}