golang 表明我们可以在不访问源代码的情况下获取调用者的函数名称。 go build -o test show_caller_name.go; rm show_caller_name.go

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 表明我们可以在不访问源代码的情况下获取调用者的函数名称。 go build -o test show_caller_name.go; rm show_caller_name.go相关的知识,希望对你有一定的参考价值。

package main

import (
	"bytes"
	"fmt"
	"runtime"
)

var (
	dunno     = []byte("???")
	centerDot = []byte("·")
	dot       = []byte(".")
)

func function(pc uintptr) []byte {
	fn := runtime.FuncForPC(pc)
	if fn == nil {
		return dunno
	}
	name := []byte(fn.Name())
	// The name includes the path name to the package, which is unnecessary
	// since the file name is already included.  Plus, it has center dots.
	// That is, we see
	//      runtime/debug.*T·ptrmethod
	// and want
	//      *T.ptrmethod
	if period := bytes.Index(name, dot); period >= 0 {
		name = name[period+1:]
	}
	name = bytes.Replace(name, centerDot, dot, -1)
	return name
}

func showCallerName() {
	pc, _, _, ok := runtime.Caller(1)
	if !ok {
		fmt.Printf("runtime.Caller() failed\n")
		return
	}
	name := function(pc)
	fmt.Printf("Caller name: %s\n", name)
}

func myCaller() {
	showCallerName()
}

func main() {
	myCaller()
}

golang 历史

Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。

Go是谷歌2009发布的第二款编程语言。2009年7月份,谷歌曾发布了Simple语言,它是用来开发Android应用的一种BASIC语言.

北京时间2010年1月10日,Go语言摘得了TIOBE公布的2009年年度大奖。该奖项授予在2009年市场份额增长最多的编程语言。

谷歌资深软件工程师罗布·派克(Rob Pike)表示,“Go让我体验到了从未有过的开发效率。”派克表示,和今天的C++或C一样,Go是一种系统语言。他解释道,“使用它可以进行快速开发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大。”

2007年,谷歌把Go作为一个20%项目开始研发,即让员工抽出本职工作之外时间的20%, 投入在该项目上。除了派克外,该项目的成员还有其他谷歌工程师也参与研发。

派克表示,编译后Go代码的运行速度与C语言非常接近,而且编译速度非常快,就像在使用一个交互式语言。现有编程语言均未专门对多核处理器进行优化。Go就是谷歌工程师为这类程序编写的一种语言。它不是针对编程初学者设计的,但学习使用它也不是非常困难。Go支持面向对象,而且具有真正的闭包(closures)和反射 (reflection)等功能。

在学习曲线方面,派克认为Go与Java类似,对于Java开发者来说,应该能够轻松学会 Go。之所以将Go作为一个开源项目发布,目的是让开源社区有机会创建更好的工具来使用该语言,例如 Eclipse IDE中的插件

谷歌公开发布的所有网络应用中,均没有使用Go,但是谷歌已经使用该语言开发了几个内部项目。派克表示,Go是否会对谷歌即将推出的Chrome OS产生影响,还言之尚早,不过Go的确可以和Native Client配合使用。他表示“Go可以让应用完美的运行在浏览器内。”例如,使用Go可以更高效的实现Wave,无论是在前端还是后台。

Go 同时具有两种编译器,一种是建立在GCC基础上的Gccgo,另外一种是分别针对64位x64和32位x86计算机的一套编译器(6g和8g)。谷歌目前正在研发其对ARM芯片和Android设备的支持。派克表示,“Android手机存在的问题是,我们一直没有一个数学协处理器。"


以上是关于golang 表明我们可以在不访问源代码的情况下获取调用者的函数名称。 go build -o test show_caller_name.go; rm show_caller_name.go的主要内容,如果未能解决你的问题,请参考以下文章

golang基础知识

golang 历史

在链接的程序集文件中,我想从 C++ 调用代码中访问一个变量。可以在不触发访问冲突的情况下执行此操作吗?

在不使用朋友类的情况下访问私人成员[重复]

我可以在不使用 useState 的情况下访问 useEffect 中的变量吗?

如何在不强制断开连接的情况下使用 Go TLS 手动验证客户端证书?