Skip to content

go

golang chromeDp 使用

借助谷歌开发者工具协议(CDP,Chrome DevTools Protocol)远程与浏览器交互

在Go中实现了Chrome DevTools协议的知名第三方库是 chromedp

linux 界面搭建 chromeDp 环境

docker-compose 搭建 headless-shell

version: '3.1'
services:
  chrome:
    image: chromedp/headless-shell:latest
    ports:
      - "9222:9222"

获取信息

curl localhost:9222/json/version
{
   "Browser": "Chrome/114.0.5735.199",
   "Protocol-Version": "1.3",
   "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.199 Safari/537.36",
   "V8-Version": "11.4.183.25",
   "WebKit-Version": "537.36 (@581ada08cf738a4eb44f712c6f8cd40030e5c1a0)",
   "webSocketDebuggerUrl": "ws://localhost:9222/devtools/browser/5b3453d9-d437-4d7d-8f23-633d10b96a15"
}

golang 使用

func main() {
    // arg : ws://url:9222/

    c, cancel := chromedp.NewRemoteAllocator(context.Background(), os.Args[1])
    defer cancel()

    ctx, cancel2 := chromedp.NewContext(c)
    defer cancel2()

    ... // logic
}

gorm学习及注意事项

实验项目

https://github.com/gofulljs/g_gorm_study

查询注意

  1. 如果model中有主键, gorm 如果使用了 model、take、first、last均会产生对应条件(只要结构体中对应字段为非零值),
info := &model.Userinfos{
    Class: "一一班",
    No:    3,
}

err := model.DB.Take(info).Error

产生sql

SELECT * FROM `userinfos` WHERE `userinfos`.`class` = '一一班' AND `userinfos`.`no` = 3 LIMIT 1
  1. 如果想查询info中一个字段为条件,又不受主键影响,有两种方式

如下只希望获取一一班中的一个学生,但info中有其他值

方式一: 使用table方法+scan方法

info := &model.Userinfos{
        Class: "一一班",
        No:    4,
    }

err := model.DB.Table(info.TableName()).Where("class = ?", info.Class).Scan(info).Error
// 或
err := model.DB.Table(info.TableName()).Where(info, model.UserinfosColumns.Class).Scan(info).Error

方式二: model中使用只带查询字段的新结构体,缺点就是不能重复利用前面的结构体了,会多消耗点资源

info := &model.Userinfos{
    Class: "一一班",
    No:    4,
}

// 如果此处查询非主键作为条件就只能用Where 的方式

err := model.DB.Model(&model.Userinfos{Class: info.Class}).Scan(info).Error
// or
err := model.DB.Model(&model.Userinfos{}).Where(info, model.UserinfosColumns.Class).Scan(info).Error
// or 
err := model.DB.Model(&model.Userinfos{}).Where("class = ?", info.Class).Scan(info).Error

golang超实用技巧

拉取私有库

比如我私有库为 github.com/gofulljs/private

1.配置ssh密钥用以拉取代码

ssh -T git@github.com
Hi gofulljs! You've successfully authenticated, but GitHub does not provide shell access.

2.配置https替换为ssh

git config --global url."git@github.com:gofulljs".insteadOf "https://github.com/gofulljs"

这样针对自己写的库都会走ssh,不会弹出

 fatal: could not read Username for 'https://github.com': terminal prompts disabled
  1. 配置自己库路径为私有,这样避免校验
go env -w GOPRIVATE=github.com/gofulljs
  1. 享受成果
go get github.com/gofulljs/private@latest

可自行打 tag 来实用自己项目了,非常happy

golang技巧

Go语言中的数值溢出检测

package main

import (
    "fmt"
    "math"
)

func addInt8WithOverflowCheck(a, b int8) (int8, bool) {
    result := a + b
    // 使用异或运算检测溢出
    overflow := (a^result)&(b^result) < 0
    return result, overflow
}

func main() {
    a := int8(-127)
    b := int8(-1)
    result, overflowed := addInt8WithOverflowCheck(a, b)
    if overflowed {
        fmt.Println("溢出发生,结果:", result)
    } else {
        fmt.Println("结果:", result)
    }
}