2024-08-23



# 安装并配置内网穿透工具 - 以 `frp` 为例
# 下载 frp 到你的 Windows 系统
frp_windows_amd64.zip (https://github.com/fatedier/frp/releases)
# 解压缩
 
# 配置 frps.ini
[common]
bind_port = 7000
 
# 启动 frps
./frps -c frps.ini
 
# 在你的 Linux 服务器上安装 frpc
# 下载 frp 到你的 Linux 服务器
frp_linux_amd64.zip (https://github.com/fatedier/frp/releases)
# 解压缩
 
# 配置 frpc.ini
[common]
server_addr = <你的 Windows IP>
server_port = 7000
 
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
 
[tunnel]
type = tcp
remote_port = 7001
local_ip = 127.0.0.1
local_port = 6333
 
# 启动 frpc
./frpc -c frpc.ini
 
# 在 GoLand 中配置 SSH 远程开发环境
# 打开 GoLand,选择 `File` > `Settings` > `Build, Execution, Deployment` > `Deployment`
# 点击 `+` 添加一个新的部署配置,选择 `SFTP`
# 填写你的服务器信息,用户名、主机、私钥等
# 在 `Mappings` 中配置本地目录与远程服务器目录的映射
# 保存配置并测试连接
 
# 配置端口转发,以便于 GoLand 可以通过内网穿透连接到你的开发环境
# 在 frpc.ini 中添加如下配置
[goland_debug_server]
type = tcp
local_ip = 127.0.0.1
local_port = 6333
remote_port = 6333
 
# 重启 frpc 使配置生效
 
# 在 GoLand 中配置远程解释器
# 选择 `File` > `Settings` > `Languages & Frameworks` > `Go` > `Go Modules (vgo)` 或 `Go SDK`
# 在 `SSH Interpreter` 中配置你的 SSH 连接信息,选择你刚才创建的部署配置
# 保存设置并重新启动 GoLand
 
# 现在你可以在 GoLand 中远程编辑、编译和调试 Linux 服务器上的 Go 代码了

这个例子展示了如何使用内网穿透工具 frp 将你的本地开发环境与远程的 Linux 服务器连接起来,并在 GoLand 中配置相关设置以实现远程开发和调试。这样可以在没有公网 IP 的情况下进行开发工作,特别适合家庭、办公室网络环境或在教育、个人项目中使用。

2024-08-23

go-callvis是一个用来可视化Go语言程序中函数调用关系的工具。以下是如何使用go-callvis的简单示例:

首先,你需要安装go-callvis:




go get -u github.com/ofabry/go-callvis

然后,你可以使用以下命令来生成一个HTML文件,其中包含了你的Go程序的函数调用关系图:




go-callvis -group pkg -min 1 your/package | fgrep -v "github.com/ofabry/go-callvis" > /tmp/callvis.html

这里的-group pkg选项表示按照包来分组显示调用关系,-min 1表示只显示最小深度为1的节点,your/package是你想要分析的Go语言包的路径。

最后,你可以在浏览器中打开生成的HTML文件来查看调用关系图:




open /tmp/callvis.html

这个命令会在你的默认浏览器中打开HTML文件,显示函数调用关系的可视化图。你可以通过拖动和缩放来浏览图表,也可以使用顶部的选择框来过滤特定的包或函数。

2024-08-23



package main
 
import (
    "fmt"
    "github.com/google/uuid"
)
 
func main() {
    // 使用Go标准库生成UUID
    u1 := uuid.New()
    fmt.Println("UUID Version 4:", u1)
 
    // 生成UUID并转化为字符串形式
    u2 := uuid.NewString()
    fmt.Println("UUID Version 4 (String):", u2)
}

这段代码演示了如何在Go语言中使用github.com/google/uuid库生成UUID。uuid.New()函数用于生成一个随机的UUID,而uuid.NewString()函数用于生成一个代表UUID的字符串。这是在Go中生成UUID的标准方法。

2024-08-23



package main
 
import "fmt"
 
// 定义一个简单的结构体
type Person struct {
    Name string
    Age  int
}
 
// 定义一个方法,接收一个Person类型的参数,返回一个表示个人信息的字符串
func (p Person) Introduce() string {
    return fmt.Sprintf("你好,我是%s,今年%d岁。", p.Name, p.Age)
}
 
func main() {
    // 创建一个Person实例
    person := Person{"小明", 25}
 
    // 调用方法并打印结果
    fmt.Println(person.Introduce())
}

这段代码定义了一个名为Person的结构体,并为其添加了一个名为Introduce的方法。在main函数中,我们创建了一个Person实例,并调用了Introduce方法,打印出了小明的个人介绍。这是Golang中的基本概念,对于学习者来说很容易理解和掌握。

2024-08-23

在Go语言中,如果你想在自己的项目中使用自己开发的包(库),你可以采用以下两种方式:

  1. 使用go get命令克隆你的包到GOPATH下。
  2. 如果你的包在Github或其他代码仓库,可以直接用go get命令克隆到GOPATH下,然后在go.mod中用相对路径引用。

以下是具体的操作步骤和示例:

方法一:使用go get命令克隆你的包到GOPATH下。

首先,你需要将你的包放在一个公开的代码仓库中,如GitHub、GitLab或者Gitee。然后在你的项目目录下运行以下命令:




go get github.com/your-username/your-package

然后在你的go.mod文件中添加以下内容:




require (
    github.com/your-username/your-package v0.0.0-20190101010101-abcdefabcdef
)

方法二:如果你的包在本地,可以用以下方式引用:

首先,在你的项目目录下运行go mod init your-project-name来初始化go.mod文件。

然后,在你的go.mod文件中添加以下内容:




require (
    your-local-package v0.0.0-20190101010101-abcdefabcdef
)
replace your-local-package => ../path-to-your-local-package

其中,your-local-package是你的本地包名,../path-to-your-local-package是你的本地包相对于你的项目目录的路径。

以上两种方法都可以让你在自己的Go项目中使用自己开发的包。在实际使用中,你可以根据你的具体情况选择合适的方法。

2024-08-23



package main
 
import (
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "gopkg.in/natefinch/lumberjack.v2"
)
 
// 配置初始化高性能Zap日志库
func InitZapLogger() (*zap.Logger, error) {
    // 根据需求配置日志的编码器,如果要使用JSON编码就使用NewJSONEncoder
    encoderConfig := zapcore.EncoderConfig{
        TimeKey:        "time",
        LevelKey:       "level",
        NameKey:        "logger",
        CallerKey:      "caller",
        MessageKey:     "msg",
        StacktraceKey:  "stacktrace",
        LineEnding:     zapcore.DefaultLineEnding,
        EncodeLevel:    zapcore.LowercaseLevelEncoder,  // 小写编码器
        EncodeTime:     zapcore.ISO8601TimeEncoder,     // ISO8601时间格式
        EncodeDuration: zapcore.SecondsDurationEncoder, // 持续时间秒数
    }
 
    // 设置日志级别
    atom := zap.NewAtomicLevelAt(zap.InfoLevel)
 
    // 配置日志的写入器,使用"lumberjack"进行日志轮转
    writeSyncer := zapcore.AddSync(&lumberjack.Logger{
        Filename:   "./logs/myapp.log", // 日志文件路径
        MaxSize:    100,               // 每个日志文件最大100MB
        MaxAge:     7,                 // 最多保留7天的日志文件
        MaxBackups: 3,                 // 最多保留3个备份
        Compress:   true,              // 压缩日志文件
    })
 
    // 构建Zap日志库的核心
    core := zapcore.NewCore(
        zapcore.NewConsoleEncoder(encoderConfig), // 控制台编码器
        writeSyncer,                              // 写入器
        atom,                                     // 日志级别
    )
 
    // 构建Zap日志库
    logger := zap.New(core)
 
    return logger, nil
}
 
func main() {
    logger, err := InitZapLogger()
    if err != nil {
        panic(err)
    }
    defer logger.Sync()
 
    logger.Info("This is an info message")
    logger.Error("This is an error message")
}

这段代码首先定义了一个配置初始化高性能Zap日志库的函数InitZapLogger,它设置了日志的编码器、日志级别、写入器,并使用了"lumberjack"日志轮转库来管理日志文件。然后在main函数中,我们创建了一个日志库实例,并使用不同级别的日志方法进行了日志记录。这个例子展示了如何在Go语言中使用Zap日志库进行高效的日志记录。

2024-08-23

在开始学习一门新的编程语言时,通常需要了解该语言的特点、设计哲学以及如何开始编写代码。以下是一个简单的Golang程序,它展示了如何打印"Hello, World!"到控制台。




package main
 
import "fmt"
 
func main() {
    fmt.Println("Hello, World!")
}

在这个例子中,我们做了以下几点:

  1. 使用package main声明这是一个主程序,表示这是一个可以独立执行的程序。
  2. 使用import "fmt"导入了Go的标准格式化库,这是用来输出文本到控制台的。
  3. 定义了一个名为main的函数,这是Go程序的入口点。
  4. 使用fmt.Println()函数打印出字符串"Hello, World!"。

通过这个简单的例子,你可以开始你的Golang学习之旅。

2024-08-23



package main
 
import (
    "fmt"
)
 
// 定义一个简单的函数,接收两个整数参数并返回它们的和
func add(a, b int) int {
    return a + b
}
 
// 主函数,程序的入口点
func main() {
    // 调用add函数并打印结果
    sum := add(10, 20)
    fmt.Println("Sum is:", sum)
}

这段代码首先导入了Go语言的fmt包,这个包用于输入输出。然后定义了一个名为add的函数,它接受两个整型参数并返回它们的和。在main函数中,我们调用了add函数并打印出结果。这个例子展示了Go语言的基本语法和函数定义。

2024-08-23

报错解释:

这个错误表明你正在尝试在 Goland 集成开发环境中使用 Delve,这是 Go 语言的一个调试工具。错误信息指出 Delve 的版本太旧,不兼容你当前使用的 Go 语言版本。

解决方法:

  1. 更新 Delve:你需要更新 Delve 到与你的 Go 版本兼容的版本。可以通过运行以下命令来更新 Delve:

    
    
    
    go get -u github.com/go-delve/delve/cmd/dlv
  2. 确保 Goland 使用的 Delve 版本与 Go 版本匹配:如果你在 Goland 中有特定的配置来指定 Delve 的路径,确保它指向正确的版本。
  3. 重启 Goland:更新 Delve 后,重启 Goland 以确保它使用的是最新版本的 Delve。
  4. 检查 Go 版本:确保你的 Go 语言版本是最新的,或者至少是 Delve 兼容的版本。如果不是,请更新你的 Go 版本。
  5. 重新尝试 Debug:在完成上述步骤后,重新尝试 Debug,看是否解决了问题。

如果上述步骤不能解决问题,可能需要查看 Goland 的日志文件,获取更多关于错误的信息,或者寻求官方支持的帮助。

2024-08-23

在Go 1.16及以上版本中,可以使用embed包来嵌入并访问文件系统上的文件或者其他编译成Go程序一部分的文件。以下是一个简单的例子,展示如何使用embed包加载和访问静态资源文件。

首先,你需要导入embed包:




import "embed"

然后,使用//go:embed指令来标记需要嵌入的文件或文件夹。例如,如果你想嵌入static目录下的所有文件:




//go:embed static/*
var staticFS embed.FS

接下来,你可以像使用http.FileSystem一样使用staticFS来提供静态资源。

下面是一个完整的示例,它创建了一个简单的HTTP服务器,提供了static目录下的静态资源:




package main
 
import (
    "embed"
    "io/fs"
    "net/http"
)
 
//go:embed static/*
var staticFS embed.FS
 
func main() {
    // 由于embed.FS的Open方法返回fs.FS,我们可以直接将其用作http.FileSystem
    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticFS))))
    http.ListenAndServe(":8080", nil)
}

在这个例子中,当你访问http://localhost:8080/static/<文件名>时,你会得到static目录下相应的文件。

请注意,embed包是Go 1.16引入的,如果你使用的是更早的版本,你需要手动管理文件的嵌入和访问。