목차
Pull and Push" >Pull and Push
expvar 라이브러리 사용 " >expvar 라이브러리 사용
expvar 库重点内容" >expvar 库重点内容
expvar 라이브러리의 주요 내용🎜" >expvar 라이브러리의 주요 내용🎜
完整示例" >完整示例
总结" >总结
백엔드 개발 Golang expvar를 사용하여 Go 프로그램 실행 측정항목 노출

expvar를 사용하여 Go 프로그램 실행 측정항목 노출

Jul 21, 2023 am 09:52 AM
프로그램을 가다

애플리케이션의 실행 지표를 얻으면 애플리케이션이 실제로 어떻게 작동하는지 더 잘 알 수 있습니다. 이러한 지표를 프로메테우스(prometheus), 자빅스(zabbix) 등의 모니터링 시스템에 연결하면 애플리케이션을 지속적으로 감지하고 이상 징후를 적시에 경고하고 처리할 수 있습니다.

Pull and Push

모니터링 시스템과 인터페이스하는 방법에는 두 가지가 있습니다. 하나는 Pull이고 다른 하나는 Push입니다.

Prometheus를 예로 들어 보겠습니다. 애플리케이션은 HTTP 인터페이스를 노출하고 Prometheus가 인터페이스를 통해 주기적으로 표시기를 캡처할 수 있도록 합니다. Push에서 애플리케이션은 표시기를 PushGateway에 적극적으로 푸시하고 Prometheus는 데이터를 캡처하기 위해 PushGateway로 이동합니다.

Go 표준 라이브러리에는 expvar라는 패키지가 있습니다. 이름은 exp와 var의 조합으로 변수를 내보낸다는 뜻입니다.

expvar는 공용 변수에 대한 표준화된 인터페이스를 제공하고 이러한 변수를 HTTP를 통해 Json 형식으로 노출하므로 Pull을 사용하여 모니터링 시스템과 연결하는 데 매우 적합합니다.

expvar 라이브러리 사용

expvar는 표준 라이브러리입니다. 즉, 추가 종속성이 필요하지 않으며 기본적으로 몇 가지 지표도 제공합니다. 이 라이브러리를 사용하는 방법을 알아봅시다.

expvar 라이브러리가 참조되는 경우(<code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #000000;background: rgba(14, 210, 247, 0.15);"><span style="font-size: 15px;">import "expvar"</span>),以下 init 函数将被自动调用。

func init() {
 http.HandleFunc("/debug/vars", expvarHandler)
 Publish("cmdline", Func(cmdline))
 Publish("memstats", Func(memstats))
}
로그인 후 복사

该函数为我们注册了 /debug/vars 路径的 HTTP 服务,访问该路径将得到 Json 格式的指标。

因此,我们还需要调用 ListenAndServe 绑定端口,并开始服务 HTTP 请求。

http.ListenAndServe(":8080", nil)
로그인 후 복사

完整代码如下

package main

import (
 _ "expvar"
 "net/http"
)

func main() {
 http.ListenAndServe(":8080", nil)
}
로그인 후 복사

将程序运行起来后,通过 curl 请求,得到以下结果

$ curl localhost:8080/debug/vars
{
"cmdline": ["/var/folders/xk/gn46n46d503dsztbc6_9qb2h0000gn/T/go-build1657217338/b001/exe/main"],
"memstats": {"Alloc":278880,"TotalAlloc":278880,"Sys":8735760,"Lookups":0,"Mallocs":1169,"Frees":87,"HeapAlloc":278880,"HeapSys":3866624,"HeapIdle":2949120,"HeapInuse":917504,"HeapReleased":2899968,"HeapObjects":1082,"StackInuse":327680,"StackSys":327680,"MSpanInuse":28696,"MSpanSys":32640,"MCacheInuse":9600,"MCacheSys":15600,"BuckHashSys":3875,"GCSys":3826448,"OtherSys":662893,"NextGC":4194304,"LastGC":0,"PauseTotalNs":0,"PauseNs":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"PauseEnd":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"NumGC":0,"NumForcedGC":0,"GCCPUFraction":0,"EnableGC":true,"DebugGC":false,"BySize":[{"Size":0,"Mallocs":0,"Frees":0},{"Size":8,"Mallocs":41,"Frees":0},{"Size":16,"Mallocs":496,"Frees":0},{"Size":24,"Mallocs":63,"Frees":0},{"Size":32,"Mallocs":28,"Frees":0},{"Size":48,"Mallocs":134,"Frees":0},{"Size":64,"Mallocs":50,"Frees":0},{"Size":80,"Mallocs":17,"Frees":0},{"Size":96,"Mallocs":17,"Frees":0},{"Size":112,"Mallocs":6,"Frees":0},{"Size":128,"Mallocs":9,"Frees":0},{"Size":144,"Mallocs":9,"Frees":0},{"Size":160,"Mallocs":18,"Frees":0},{"Size":176,"Mallocs":6,"Frees":0},{"Size":192,"Mallocs":0,"Frees":0},{"Size":208,"Mallocs":37,"Frees":0},{"Size":224,"Mallocs":6,"Frees":0},{"Size":240,"Mallocs":0,"Frees":0},{"Size":256,"Mallocs":12,"Frees":0},{"Size":288,"Mallocs":7,"Frees":0},{"Size":320,"Mallocs":2,"Frees":0},{"Size":352,"Mallocs":13,"Frees":0},{"Size":384,"Mallocs":1,"Frees":0},{"Size":416,"Mallocs":30,"Frees":0},{"Size":448,"Mallocs":1,"Frees":0},{"Size":480,"Mallocs":2,"Frees":0},{"Size":512,"Mallocs":0,"Frees":0},{"Size":576,"Mallocs":5,"Frees":0},{"Size":640,"Mallocs":5,"Frees":0},{"Size":704,"Mallocs":3,"Frees":0},{"Size":768,"Mallocs":0,"Frees":0},{"Size":896,"Mallocs":6,"Frees":0},{"Size":1024,"Mallocs":8,"Frees":0},{"Size":1152,"Mallocs":10,"Frees":0},{"Size":1280,"Mallocs":3,"Frees":0},{"Size":1408,"Mallocs":1,"Frees":0},{"Size":1536,"Mallocs":0,"Frees":0},{"Size":1792,"Mallocs":7,"Frees":0},{"Size":2048,"Mallocs":2,"Frees":0},{"Size":2304,"Mallocs":3,"Frees":0},{"Size":2688,"Mallocs":2,"Frees":0},{"Size":3072,"Mallocs":0,"Frees":0},{"Size":3200,"Mallocs":0,"Frees":0},{"Size":3456,"Mallocs":0,"Frees":0},{"Size":4096,"Mallocs":8,"Frees":0},{"Size":4864,"Mallocs":1,"Frees":0},{"Size":5376,"Mallocs":1,"Frees":0},{"Size":6144,"Mallocs":2,"Frees":0},{"Size":6528,"Mallocs":0,"Frees":0},{"Size":6784,"Mallocs":0,"Frees":0},{"Size":6912,"Mallocs":0,"Frees":0},{"Size":8192,"Mallocs":2,"Frees":0},{"Size":9472,"Mallocs":8,"Frees":0},{"Size":9728,"Mallocs":0,"Frees":0},{"Size":10240,"Mallocs":0,"Frees":0},{"Size":10880,"Mallocs":0,"Frees":0},{"Size":12288,"Mallocs":0,"Frees":0},{"Size":13568,"Mallocs":0,"Frees":0},{"Size":14336,"Mallocs":0,"Frees":0},{"Size":16384,"Mallocs":0,"Frees":0},{"Size":18432,"Mallocs":0,"Frees":0}]}
}
로그인 후 복사

可以看到,expvar 默认已提供了两项指标,分别是程序执行命令(os.Args)和运行时内存分配(runtime.Memstats)信息。

expvar 库重点内容

expvar 中最重要的是 Publish 函数和 Var 接口。

func Publish(name string, v Var) {}
로그인 후 복사

Publish 函数签名中需要两个参数,name 是我们指定的指标名。例如在上文 expvar 的 init 函数下 <span style="font-size: 15px;">Publish("cmdline", Func(cmdline))</span>代码行,其中<span style="font-size: 15px;">cmdline</span>就是指标名,而<span style="font-size: 15px;">Func(cmdline)</span>import "expvar"), 다음 init 함수가 자동으로 호출됩니다.

// Var is an abstract type for all exported variables.
type Var interface {
 // String returns a valid JSON value for the variable.
 // Types with String methods that do not return valid JSON
 // (such as time.Time) must not be used as a Var.
 String() string
}
로그인 후 복사
로그인 후 복사
이 함수는 /debug/vars 경로의 HTTP 서비스를 등록합니다. 이 경로에 액세스하면 Json 형식의 표시기가 나타납니다.

🎜🎜🎜 따라서 포트를 바인딩하고 HTTP 요청 처리를 시작하려면 ListenAndServe도 호출해야 합니다. 🎜🎜
type Int struct {
 i int64
}

type Float struct {
 f uint64
}

type Map struct {
 m      sync.Map // map[string]Var
 keysMu sync.RWMutex
 keys   []string // sorted
}

type String struct {
 s atomic.Value // string
}

type Func func() any
로그인 후 복사
로그인 후 복사
🎜🎜완전한 코드는 다음과 같습니다🎜🎜
intVar = expvar.NewInt(“metricName”)
floatVar = expvar.NewFloat(“metricName”)
mapVar = expvar.NewMap(“metricName”)
stringVar = expvar.NewString(“metricName”)
로그인 후 복사
로그인 후 복사
🎜🎜프로그램을 실행한 후, 컬 요청을 통해 다음과 같은 결과를 얻습니다.🎜🎜
func NewInt(name string) *Int {
 v := new(Int)
 Publish(name, v)
 return v
}
로그인 후 복사
로그인 후 복사
🎜🎜보시다시피, expvar는 기본적으로 두 가지 지표를 제공합니다. 프로그램 실행 명령(os.Args) 및 런타임 메모리 할당(runtime.Memstats) 정보. 🎜🎜

expvar 라이브러리의 주요 내용🎜

🎜🎜expvar에서 가장 중요한 것은 게시 기능입니다. 및 Var 인터페이스. 🎜🎜
type MyStruct struct {
 Field1 string
 Field2 int
 Field3 float64
}
로그인 후 복사
로그인 후 복사
🎜🎜Publish 함수 서명에는 두 개의 매개변수가 필요하며, name은 우리가 지정한 표시기 이름입니다. 예를 들어, 위의 expvar init 함수에서 🎜🎜Publish("cmdline", Func(cmdline))🎜🎜코드 줄, 여기서🎜🎜cmdline🎜🎜은 표시기 이름이고 🎜🎜Func(cmdline)🎜🎜은 expvar.Func입니다. Var 인터페이스 유형 변수입니다. 🎜🎜🎜🎜Var 인터페이스는 String 메서드만 정의합니다. 이 메서드는 유효한 Json 문자열을 반환해야 한다는 점에 유의해야 합니다. 🎜🎜
// Var is an abstract type for all exported variables.
type Var interface {
 // String returns a valid JSON value for the variable.
 // Types with String methods that do not return valid JSON
 // (such as time.Time) must not be used as a Var.
 String() string
}
로그인 후 복사
로그인 후 복사

为了方便使用,expvar 库中提供了五种导出变量类型,它们均实现了 Var 接口。

type Int struct {
 i int64
}

type Float struct {
 f uint64
}

type Map struct {
 m      sync.Map // map[string]Var
 keysMu sync.RWMutex
 keys   []string // sorted
}

type String struct {
 s atomic.Value // string
}

type Func func() any
로그인 후 복사
로그인 후 복사

我们分别通过调用 expvar.NewXXX 函数即可完成前四种类型的变量创建与指标注册。

intVar = expvar.NewInt(“metricName”)
floatVar = expvar.NewFloat(“metricName”)
mapVar = expvar.NewMap(“metricName”)
stringVar = expvar.NewString(“metricName”)
로그인 후 복사
로그인 후 복사

例如 expvar.NewInt 函数,它会内部调用 Publish 方法完成指标名与 expvar.Int 类型变量的绑定。

func NewInt(name string) *Int {
 v := new(Int)
 Publish(name, v)
 return v
}
로그인 후 복사
로그인 후 복사

而 expvar.Func 类型,其实是为了让我们可以自定义导出类型。

例如,假如我们想要暴露以下定义的结构体

type MyStruct struct {
 Field1 string
 Field2 int
 Field3 float64
}
로그인 후 복사
로그인 후 복사

首先需要创建一个数据生成函数。它用于在每次调用 HTTP 服务路径时,通过该函数导出这里面的数据。

func MyStructData() interface{} {
 return MyStruct{
  Field1: "Gopher",
  Field2: 22,
  Field3: 19.99,
 }
}
로그인 후 복사

最后,通过 Publish 函数注册指标名即可。

expvar.Publish("metricName", expvar.Func(MyStructData))
로그인 후 복사

完整示例

下面,我们给出一个覆盖五种导出变量类型的完整示例。

package main

import (
 "expvar"
 "github.com/shirou/gopsutil/v3/host"
 "github.com/shirou/gopsutil/v3/load"
 "github.com/shirou/gopsutil/v3/mem"
 "net/http"
 "time"
)

type Load struct {
 Load1  float64
 Load5  float64
 Load15 float64
}

func AllLoadAvg() interface{} {
 return Load{
  Load1:  LoadAvg(1),
  Load5:  LoadAvg(5),
  Load15: LoadAvg(15),
 }
}

func LoadAvg(loadNumber int) float64 {
 avg, _ := load.Avg()
 switch loadNumber {
 case 5:
  return avg.Load5
 case 15:
  return avg.Load15
 default:
  return avg.Load1
 }
}

func main() {
 var (
  aliveOfSeconds = expvar.NewInt("aliveOfSeconds")
  hostID         = expvar.NewString("hostID")
  lastLoad       = expvar.NewFloat("lastLoad")
  virtualMemory  = expvar.NewMap("virtualMemory")
 )
 expvar.Publish("allLoadAvg", expvar.Func(AllLoadAvg))
 h, _ := host.HostID()
 hostID.Set(h)

 go http.ListenAndServe(":8080", nil)

 for {
  aliveOfSeconds.Add(1)
  vm, _ := mem.VirtualMemory()
  lastLoad.Set(LoadAvg(1))
  virtualMemory.Add("active", int64(vm.Active))
  virtualMemory.Add("buffer", int64(vm.Buffers))
  time.Sleep(1 * time.Second)
 }
}
로그인 후 복사

在上述示例中,我们通过 gopsutil 库(介绍可见还在自己写 Go 系统监控函数吗一文)获取了一些系统信息,并展示了如何通过 expvar 中的各种变量类型将这些信息进行导出。

curl 访问 localhost:8080/debug/vars 结果如下

$ curl localhost:8080/debug/vars
{
"aliveOfSeconds": 1,
"allLoadAvg": {"Load1":1.69580078125,"Load5":1.97412109375,"Load15":1.90283203125},
"cmdline": ["/var/folders/xk/gn46n46d503dsztbc6_9qb2h0000gn/T/go-build3566019824/b001/exe/main"],
"hostID": "7a1a74f2-30fc-5bc1-b439-6b7aef22e58d",
"lastLoad": 1.69580078125,
"memstats": {"Alloc":256208,"TotalAlloc":256208,"Sys":8735760,"Lookups":0,"Mallocs":1089,"Frees":48,"HeapAlloc":256208,"HeapSys":3866624,"HeapIdle":2891776,"HeapInuse":974848,"HeapReleased":2859008,"HeapObjects":1041,"StackInuse":327680,"StackSys":327680,"MSpanInuse":19992,"MSpanSys":32640,"MCacheInuse":9600,"MCacheSys":15600,"BuckHashSys":3905,"GCSys":3851120,"OtherSys":638191,"NextGC":4194304,"LastGC":0,"PauseTotalNs":0,"PauseNs":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"PauseEnd":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"NumGC":0,"NumForcedGC":0,"GCCPUFraction":0,"EnableGC":true,"DebugGC":false,"BySize":[{"Size":0,"Mallocs":0,"Frees":0},{"Size":8,"Mallocs":35,"Frees":0},{"Size":16,"Mallocs":415,"Frees":0},{"Size":24,"Mallocs":71,"Frees":0},{"Size":32,"Mallocs":37,"Frees":0},{"Size":48,"Mallocs":141,"Frees":0},{"Size":64,"Mallocs":52,"Frees":0},{"Size":80,"Mallocs":20,"Frees":0},{"Size":96,"Mallocs":23,"Frees":0},{"Size":112,"Mallocs":14,"Frees":0},{"Size":128,"Mallocs":7,"Frees":0},{"Size":144,"Mallocs":7,"Frees":0},{"Size":160,"Mallocs":18,"Frees":0},{"Size":176,"Mallocs":6,"Frees":0},{"Size":192,"Mallocs":1,"Frees":0},{"Size":208,"Mallocs":42,"Frees":0},{"Size":224,"Mallocs":3,"Frees":0},{"Size":240,"Mallocs":0,"Frees":0},{"Size":256,"Mallocs":9,"Frees":0},{"Size":288,"Mallocs":8,"Frees":0},{"Size":320,"Mallocs":5,"Frees":0},{"Size":352,"Mallocs":13,"Frees":0},{"Size":384,"Mallocs":3,"Frees":0},{"Size":416,"Mallocs":33,"Frees":0},{"Size":448,"Mallocs":0,"Frees":0},{"Size":480,"Mallocs":2,"Frees":0},{"Size":512,"Mallocs":1,"Frees":0},{"Size":576,"Mallocs":4,"Frees":0},{"Size":640,"Mallocs":8,"Frees":0},{"Size":704,"Mallocs":3,"Frees":0},{"Size":768,"Mallocs":1,"Frees":0},{"Size":896,"Mallocs":6,"Frees":0},{"Size":1024,"Mallocs":8,"Frees":0},{"Size":1152,"Mallocs":9,"Frees":0},{"Size":1280,"Mallocs":3,"Frees":0},{"Size":1408,"Mallocs":1,"Frees":0},{"Size":1536,"Mallocs":1,"Frees":0},{"Size":1792,"Mallocs":9,"Frees":0},{"Size":2048,"Mallocs":1,"Frees":0},{"Size":2304,"Mallocs":2,"Frees":0},{"Size":2688,"Mallocs":2,"Frees":0},{"Size":3072,"Mallocs":0,"Frees":0},{"Size":3200,"Mallocs":1,"Frees":0},{"Size":3456,"Mallocs":0,"Frees":0},{"Size":4096,"Mallocs":5,"Frees":0},{"Size":4864,"Mallocs":0,"Frees":0},{"Size":5376,"Mallocs":1,"Frees":0},{"Size":6144,"Mallocs":1,"Frees":0},{"Size":6528,"Mallocs":0,"Frees":0},{"Size":6784,"Mallocs":0,"Frees":0},{"Size":6912,"Mallocs":0,"Frees":0},{"Size":8192,"Mallocs":1,"Frees":0},{"Size":9472,"Mallocs":8,"Frees":0},{"Size":9728,"Mallocs":0,"Frees":0},{"Size":10240,"Mallocs":0,"Frees":0},{"Size":10880,"Mallocs":0,"Frees":0},{"Size":12288,"Mallocs":0,"Frees":0},{"Size":13568,"Mallocs":0,"Frees":0},{"Size":14336,"Mallocs":0,"Frees":0},{"Size":16384,"Mallocs":0,"Frees":0},{"Size":18432,"Mallocs":0,"Frees":0}]},
"virtualMemory": {"active": 1957449728, "buffer": 0}
}
로그인 후 복사

总结

标准库 expvar 为需要导出的公共变量提供了一个标准化的接口,使用比较简单。

expvar 包内部定义的几种基础类型都相应给出了并发安全的操作方法,我们不需要去重复实现一遍,能够开箱即用。

그러나 https://go.dev/의 공공 프로젝트 통계에 따르면 이 라이브러리의 수입 건수는 10,000건 미만입니다.

expvar를 사용하여 Go 프로그램 실행 측정항목 노출

expvar를 사용하여 Go 프로그램 실행 측정항목 노출

다른 표준 라이브러리의 import 수에 비해 expvar의 존재감이 너무 낮습니다.

위 내용은 expvar를 사용하여 Go 프로그램 실행 측정항목 노출의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Go 프로그램의 핫스위치 기능을 좀 더 멋지게 구현하는 방법 Go 프로그램의 핫스위치 기능을 좀 더 멋지게 구현하는 방법 Jul 21, 2023 pm 12:00 PM

개발 중에 열 스위치가 필요한 경우가 종종 있습니다. 즉, 프로그램이 실행되는 동안 적절한 시간에 특정 기능을 켜거나 끌 수 있습니다. 예를 들어 성능 분석에 사용되는 pprof 샘플링은 일반적인 열 스위치입니다. 이 기사에서는 이 열 스위치를 더 시원하게 만드는 방법에 대해 설명합니다.

expvar를 사용하여 Go 프로그램 실행 측정항목 노출 expvar를 사용하여 Go 프로그램 실행 측정항목 노출 Jul 21, 2023 am 09:52 AM

애플리케이션의 실행 지표를 얻으면 애플리케이션이 실제로 어떻게 작동하는지 더 잘 이해할 수 있습니다. 이러한 지표를 프로메테우스(prometheus), 자빅스(zabbix) 등의 모니터링 시스템에 연결하면 애플리케이션을 지속적으로 감지하고 이상 징후를 적시에 경고하고 처리할 수 있습니다.

종속성 누락으로 인해 Go 프로그램이 컴파일되지 않는 이유는 무엇입니까? 종속성 누락으로 인해 Go 프로그램이 컴파일되지 않는 이유는 무엇입니까? Jun 10, 2023 pm 02:33 PM

Go는 다른 프로그래밍 언어에 비해 더 빠르게 컴파일되고 더 적은 메모리를 소비하는 인기 있는 프로그래밍 언어입니다. 그러나 때때로 Go 프로그램은 종속성 누락으로 인해 컴파일에 실패합니다. 그렇다면 왜 이런 일이 발생합니까? 먼저 Go 컴파일의 원리를 이해해야 합니다. Go는 정적으로 컴파일되는 언어입니다. 즉, 컴파일 중에 프로그램이 기계어 코드로 변환된 다음 직접 실행됩니다. 동적으로 컴파일되는 언어와 비교할 때 Go의 컴파일 프로세스는 사용되는 모든 패키지를 컴파일하기 전에 변환해야 하기 때문에 더 복잡합니다.

내 Go 프로그램이 GoQUIC 라이브러리를 올바르게 사용하지 않는 이유는 무엇입니까? 내 Go 프로그램이 GoQUIC 라이브러리를 올바르게 사용하지 않는 이유는 무엇입니까? Jun 09, 2023 pm 04:55 PM

최근 점점 더 많은 사람들이 GoQUIC을 사용하여 웹 애플리케이션을 구축하기 시작했습니다. 효율적인 전송 성능과 신뢰성으로 인해 GoQUIC은 많은 프로젝트에서 첫 번째 선택이 되었습니다. 그러나 실제 사용 중에 일부 개발자는 Go 프로그램이 GoQUIC 라이브러리를 올바르게 사용할 수 없다는 사실을 발견했습니다. 다음으로 Go 프로그램이 GoQUIC 라이브러리를 정상적으로 사용할 수 없게 되는 원인을 분석해 보겠습니다. 1. 버전 문제 먼저 GoQUIC 버전이 최신인지 확인해야 합니다. GoQUIC은 다음과 같은 경우 자주 업데이트됩니다.

Go 프로그램이 너무 큽니다. 지연 초기화를 사용할 수 있나요? Go 프로그램이 너무 큽니다. 지연 초기화를 사용할 수 있나요? Aug 04, 2023 pm 05:23 PM

회사의 지속적인 발전에서 대부분은 처음에는 대규모 단위였으며 변화가 느렸습니다. 창고는 10년 이상 사용될 예정이며 창고의 규모는 기본적으로 지속적인 증가 과정입니다.

Go 프로그램의 예외 처리가 작동하지 않는 이유는 무엇입니까? Go 프로그램의 예외 처리가 작동하지 않는 이유는 무엇입니까? Jun 10, 2023 am 10:13 AM

Golang(Go)은 오류와 예외를 처리하는 데 매우 능숙한 언어입니다. 다른 언어와 달리 Go는 간단하면서도 효과적인 오류 처리 메커니즘을 통해 예외를 처리합니다. Go의 오류 처리 메커니즘은 매우 강력하고 유연하지만 일부 프로그래머는 여전히 프로그램에서 오류 처리를 구현하는 데 어려움을 겪고 있습니다. 이 글은 Go 프로그램에서 예외 처리가 작동하지 않는 이유와 예외 상황을 올바르게 처리하는 방법에 대한 질문을 해결하는 데 도움을 주기 위해 작성되었습니다. Go에서 비효율적인 예외 처리는 일반적으로 프로그래머가 오류를 올바르게 처리하지 않거나 실수를 함으로써 발생합니다.

내 Go 프로그램이 실행될 때 '코어 덤프' 오류가 발생하는 이유는 무엇입니까? 내 Go 프로그램이 실행될 때 '코어 덤프' 오류가 발생하는 이유는 무엇입니까? Jun 09, 2023 pm 05:49 PM

Go 언어를 사용하여 개발하는 과정에서 다양한 오류에 직면하게 되는 것은 불가피합니다. 일반적인 오류 중 하나는 "코어 덤프"이며, 이 오류 메시지는 일부 개발자에게 혼란을 줄 수 있습니다. 이 문서에서는 이 오류의 원인과 해결 방법을 설명합니다. "coredumped"의 의미 Linux 운영 체제에서 "coredumped"는 프로세스가 실행 중에 예기치 않게 종료되어 소위 "core" 파일이 생성되었음을 나타내는 오류 메시지입니다. 이것

내 Go 프로그램이 RabbitMQ 라이브러리를 올바르게 사용하지 않는 이유는 무엇입니까? 내 Go 프로그램이 RabbitMQ 라이브러리를 올바르게 사용하지 않는 이유는 무엇입니까? Jun 09, 2023 pm 05:02 PM

빅 데이터 시대의 도래와 함께 효율적인 통신 방법으로 메시지 큐가 소프트웨어 설계에 점점 더 널리 사용되고 있습니다. 인기 있는 메시지 대기열 라이브러리인 RabbitMQ도 프로그래머들에게 선호됩니다. 그러나 일부 프로그래머는 RabbitMQ 라이브러리를 사용할 때 몇 가지 문제에 직면할 수 있습니다. 이 기사에서는 몇 가지 일반적인 문제와 해결 방법을 소개합니다. 패키지 가져오기 오류 Go 프로그램에서는 import 문을 통해 외부 라이브러리를 사용해야 합니다. RabbitMQ를 사용하고 싶다면

See all articles