我跑去go get package
下载一个软件包,然后才知道我需要设置我的GOPATH
软件包否则我的root Go安装(我更喜欢保持我的Go安装干净并将内核与自定义分开).如何删除先前安装的软件包?
鉴于你有一个接受的功能的场景t interface{}
.如果确定t
是切片,我range
该如何切片?我不会知道传入的类型,例如[]string
,[]int
或者[]MyType
,在编译时.
func main() {
data := []string{"one","two","three"}
test(data)
moredata := []int{1,2,3}
test(data)
}
func test(t interface{}) {
switch reflect.TypeOf(t).Kind() {
case reflect.Slice:
// how do I iterate here?
for _,value := range t {
fmt.Println(value)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何解析Go中的非标准日期/时间字符串.在示例中,如果我想将字符串10/15/1983
转换为time.Time
?据time.Parse()
推测,该功能允许您指定格式.
http://play.golang.org/p/v5DbowXt1x
package main
import "fmt"
import "time"
func main() {
test, err := time.Parse("10/15/1983", "10/15/1983")
if err != nil {
panic(err)
}
fmt.Println(test)
}
Run Code Online (Sandbox Code Playgroud)
这导致恐慌.
panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"
逻辑上这是有道理的,因为它应该知道哪一天是哪一天,哪一个月.
其他语言的功能类似于以下内容:
parse("mm/dd/yyyy", "10/15/1983")
我在Go文档中找不到这样的功能,是我正则表达式的唯一选择吗?
在Golang中,如何在根目录下提供静态内容,同时仍具有用于提供主页的根目录处理程序.
使用以下简单Web服务器作为示例:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", HomeHandler) // homepage
http.ListenAndServe(":8080", nil)
}
func HomeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "HomeHandler")
}
Run Code Online (Sandbox Code Playgroud)
如果我做
http.Handle("/", http.FileServer(http.Dir("./")))
Run Code Online (Sandbox Code Playgroud)
我收到一个恐慌,说我有两个"/"注册.我在互联网上找到的每个Golang示例都建议从不同的目录中提供静态内容,但这对于sitemap.xml,favicon.ico,robots.txt和其他文件来说无济于事.强制要求永远服务于根.
我寻求的行为是大多数Web服务器(如Apache,Nginx或IIS)中的行为,它首先遍历您的规则,如果没有找到规则,它会查找实际文件,如果没有找到文件, 404.我的猜测是http.HandlerFunc
,我需要编写一个http.Handler
检查我是否引用带扩展名的文件,如果是,检查文件是否存在并提供文件,否则它404s或服务主页是请求是"/".不幸的是,我不确定如何开始这样的任务.
我的一部分说我大概过度复杂的情况让我觉得我错过了什么?任何指导将不胜感激.
目标
我正在开发一个为Coldfusion CFscript创建Varscoper的项目.基本上,这意味着检查源代码文件以确保开发人员正确地使用var
他们的变量.
在使用ANTLR V4几天后,我有一个语法,在GUI视图中生成一个非常好的解析树.现在,使用该树,我需要一种方法来以编程方式在节点上爬行和寻找变量声明,并确保如果它们在函数内部,则它们具有适当的范围.如果可能的话,我宁愿不在语法文件中这样做,因为这需要将语言的定义与此特定任务混合.
我试过的
我最近的尝试是使用ParserRuleContext
并尝试通过它的children
通过getPayload()
.在检查了类之后,getPayLoad()
我会有一个ParserRuleContext
对象或一个Token
对象.不幸的是,使用它我永远无法找到获取特定节点的实际规则类型的方法,只有它包含文本.每个节点的规则类型都是必需的,因为该文本节点是否是被忽略的右手表达式,变量赋值或函数声明都很重要.
问题
这是我的示例java代码:
Cfscript.java
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.Trees;
public class Cfscript {
public static void main(String[] args) throws Exception {
ANTLRInputStream input = new ANTLRFileStream(args[0]);
CfscriptLexer lexer = new CfscriptLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
CfscriptParser parser = new CfscriptParser(tokens);
parser.setBuildParseTree(true);
ParserRuleContext tree = parser.component();
tree.inspect(parser); // show in gui
/*
Recursively go though tree finding function declarations and …
Run Code Online (Sandbox Code Playgroud) 我正在研究用Go编写的模板系统,这意味着它需要自由使用reflect
包.在这种特定情况下,我需要能够动态调用方法interface{}
.奇怪的是,只要我的数据是已知类型,我的反射逻辑就可以正常工作,但如果数据属于类型则不行interface{}
.
在下面的例子中,您可以看到逻辑中main()
和Pass()
相同.唯一的区别是数据是已知类型还是已知类型interface{}
去玩:http://play.golang.org/p/FTP3wgc0sZ
package main
import (
"fmt"
"reflect"
)
type Test struct {
Start string
}
func (t *Test) Finish() string {
return t.Start + "finish"
}
func Pass(i interface{}) {
_, ok := reflect.TypeOf(&i).MethodByName("Finish")
if ok {
fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0])
} else {
fmt.Println("Pass() fail")
}
}
func main() {
i := Test{Start: "start"}
Pass(i)
_, ok := reflect.TypeOf(&i).MethodByName("Finish")
if ok {
fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0])
} else { …
Run Code Online (Sandbox Code Playgroud) 关键问题是,如果符号链接指向的源文件不存在,但(现在已死)符号链接仍然存在,fs.exists(symlink)
则将返回false
.
这是我的测试用例:
var fs = require("fs");
var src = __dirname + "/src.txt";
var dest = __dirname + "/dest.txt";
// create a file at src
fs.writeFile(src, "stuff", function(err) {
// symlink src at dest
fs.symlink(src, dest, "file", function(err) {
// ensure dest exists
fs.exists(dest, function(exists) {
console.log("first exists", exists);
// unlink src
fs.unlink(src, function(err) {
// ensure dest still exists
fs.exists(dest, function(exists) {
console.log("exists after unlink src", exists);
});
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
结果是:
first exists true …
Run Code Online (Sandbox Code Playgroud) 在我们的Web应用程序中,我们遇到了这样一种情况:我们需要从一个域控制到我们完全控制的另一个域的跨域AJAX调用.我一直在寻找最佳解决方案,我想到的两个是本地文件代理(使用php :: fopen的本地文件)或jquery/JSONP.
当我在网上查看时,我看到人们经常谈论使用JSONP是多么危险,因为有人可能会用它注入恶意数据.令人困惑的是,大多数反对它的论据似乎都没有多少水,所以我来这里要求Stack澄清.
跨域JSONP将打开哪些特定的攻击媒介?
根据我的理解,JSONP的唯一向量是完全相同的向量,它通过<script>
在您的站点上包含一个标记来打开,该标记的src 是不受您控制的任何站点:它们可以变为恶意并开始耕种用户会话/ cookie /数据.如果这是真的,那么似乎不是协议(JSONP)是关注点,而是从中收集数据的源.
因为无论是服务器端代理,<script>
标签还是ajax/JSONP,风险在于我将其他人的内容放在我的页面上,如果他们觉得有必要,他们可以开始耕种用户会话(以某种方式确切地说是什么Google分析通过脚本标记完成.
我在网上听到的许多向量都取决于用户提交的表单和数据的不正确验证.在示例中,JSONP用于提取某个文件,该文件将数据放入表单中,然后提交表单以进行数据库插入.如果来自该表单的数据是可信的,因为它来自被认为是安全的源(JSONP数据),并且在没有验证的情况下放入,那么同样不是JSONP出错,而是未正确验证的用户输入.用户可以使用Firebug对该表单进行完全相同的修改,但最后我检查没有人给Firebug一个安全向量.
最后一个要素是服务器端代理有一个更强大的功能,可以在将结果传递给客户端之前对结果进行过滤.然而,无论是PHP还是Javascript,我都可以过滤结果以删除onclick或iframe等内容.当然,有些客户端可以改变我的javascript函数来删除过滤,但过滤只会影响他们的特定客户端体验,并且不会被其他用户更改,从而阻止永久的多客户端XSS攻击.
显然,服务器端代理有一些好处,因为它可以使记录潜在的XSS攻击更容易,但就防止攻击而言,PHP和Javascript似乎都有足够的实用程序.在某些方面,似乎JSONP实际上比简单<script>
标签更安全,因为至少使用JSONP,结果通过一个函数,这意味着它有点过滤,而不是像毯子一样信任<script>
.
是否有一些我失踪或忽视的风险?如果我正确理解了问题,那么使用JSONP从我们信任的来源包含我们信任的文件的内容就没有安全风险.这是一个准确的评估吗?
解
如果两端都是可信的,那么JSONP就没有危险(它基本上只是一个<script>
标签).
Script/JSONP都具有相同的安全漏洞,因为它们是自动执行的,而不是简单地作为数据传输.使用服务器端代理意味着跨域返回作为数据传递,并且可以针对恶意内容进行过滤.如果跨域完全受信任,则JSONP/SCRIPT是安全的,如果存在任何风险怀疑,则将其传递给过滤器代理.
这是我最近在CF9中遇到的一个非常奇怪的错误.任何人都知道它为什么会发生,如果我做错了什么,或者有可用的修补程序.请查看以下代码.我们取一个字符串,添加一个A,添加一个B,然后尝试添加一个C ......但我们得到的结果是"ababc".预期的结果是"abc".只有在参数传递和&=
函数调用中的运算符中执行命名参数和隐式结构时,才会出现该错误.如果不存在这3个案例中的任何一个,则不会发生错误.有什么想法吗?
<cffunction name="test">
<cfargument name="widget">
<cfset var locals = StructNew()>
<cfreturn arguments.widget.value>
</cffunction>
<cfset return = "">
<cfset return &= "a">
<cfset return &= "b">
<cfset return &= test(widget = { value = "c" })>
<cfoutput>#return#</cfoutput>
Run Code Online (Sandbox Code Playgroud) 如何使用New Relic来记录使用New Relic应用程序监控导致进程崩溃的错误?我正在尝试完成的关键事项是出现错误,导致进程仍然被记录,并在仪表板上过滤掉这些错误.
到目前为止,这是我的理解:
New Relic每分钟都会将数据传输到云端.在uncaughtException
发生事件时,这将导致当前等待传输的所有数据丢失.
有一个newrelic.noticeError()
应该采用第二个参数,允许您传递带有错误的自定义参数.新文件获取错误,但不是自定义参数.
简单示例:
var newrelic = require("newrelic");
var express = require("express");
var app = express();
app.get("/softFail/", function(req, res) {
res.send(500, "softFail");
});
app.get("/hardFail/", function(req, res) {
setImmediate(function() {
throw new Error("I failed");
});
});
app.listen(80);
process.on("uncaughtException", function(err) {
console.error("Uncaught Exception");
console.error(err.stack);
newrelic.addCustomParameter("crash", "true");
newrelic.noticeError(err);
console.log("sending errors to New Relic");
newrelic.agent.harvest(function() {
console.log("send complete, crashing process");
process.exit(1);
});
});
Run Code Online (Sandbox Code Playgroud)
如果我调用/ hardFail /我能够使用New Relic来至少记录错误,那么使用该代码块.没有uncaughtException
处理程序,我没有得到任何新的Relic.问题是我无法区分崩溃进程的错误和正常的HTTP 500错误.
这是我尝试过的东西:
如果我尝试添加 …
go ×5
coldfusion ×2
go-reflect ×2
node.js ×2
reflection ×2
antlr ×1
antlr4 ×1
coldfusion-9 ×1
jquery ×1
jsonp ×1
newrelic ×1
security ×1
slice ×1
time ×1
webserver ×1
xss ×1