C++角度的go规范 | 青训营笔记

99 阅读2分钟

这是我参与[第五届青训营]的第5天

C++简要定义

C++ 是一种静态类型的编程语言,允许工程师使用面向对象、函数式或通用编程方法。C++ 的主要优点是灵活性,因为它使开发人员能够为许多平台设计程序。

由于 C++ 的多功能性和自下而上的程序创建方法,工程师可以完全控制每段代码并将它们整合到复杂的系统中。C++ 为开发人员提供高级和中级功能,以利用创造力并为任何平台构建任何程序。

Go的简单定义

Go 或 Golang 是一种静态类型的通用编程语言,以支持并发计算而闻名。Go 允许开发人员高效地使用多核 CPU 并提高程序性能。

Go 于 2012 年由 Google 发布,用于在公司内部替代 C++。

C++ 和 Go 非常适合创建复杂的系统和方便的工具。C++ 为编写程序提供了更大的灵活性,但也要求承担更大的责任。Go 对程序员更友好,但包含某些限制。

  • 如果我们希望深入研究代码并更好地控制您的程序,那么 C++ 是一个最佳的选择。

  • Go 适合那些想快速提升职业生涯的人,因为它是一种现代的、可扩展的开源语言。

// URLTest get the delay for the specified URL
// implements C.Proxy
func (p *Proxy) URLTest(ctx context.Context, url string) (t uint16, err error) {
	defer func() {
		p.alive.Store(err == nil)
		record := C.DelayHistory{Time: time.Now()}
		if err == nil {
			record.Delay = t
		}
		p.history.Put(record)
		if p.history.Len() > 10 {
			p.history.Pop()
		}
	}()

	addr, err := urlToMetadata(url)
	if err != nil {
		return
	}

	start := time.Now()
	instance, err := p.DialContext(ctx, &addr)
	if err != nil {
		return
	}
	defer instance.Close()

	req, err := http.NewRequest(http.MethodHead, url, nil)
	if err != nil {
		return
	}
	req = req.WithContext(ctx)

	transport := &http.Transport{
		Dial: func(string, string) (net.Conn, error) {
			return instance, nil
		},
		// from http.DefaultTransport
		MaxIdleConns:          100,
		IdleConnTimeout:       90 * time.Second,
		TLSHandshakeTimeout:   10 * time.Second,
		ExpectContinueTimeout: 1 * time.Second,
	}

	client := http.Client{
		Transport: transport,
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
			return http.ErrUseLastResponse
		},
	}
	defer client.CloseIdleConnections()

	resp, err := client.Do(req)
	if err != nil {
		return
	}
	resp.Body.Close()
	t = uint16(time.Since(start) / time.Millisecond)
	return
}

过程是一个UDP的测试程序,将url请求转化为元数据进行计算误差。