小编Bra*_*ody的帖子

Go - 解码/编码asn.1

有谁知道如何在Go中使用asn1 Marshal和Unmarshal函数的好例子?

我熟悉如何使用ASN.1进行DER编码的概念,但是没有直接在代码中处理它的经验(通常我正在使用包装它的另一个库 - openldap或其他).

是的,我查看了文档(http://golang.org/pkg/encoding/asn1/),它似乎描述了一个标记系统,就像Go中可用于JSON和XML的标记系统一样; 但是我还没有为encoding/asn1包找到一个很好的实例.(嗯,好吧,我在asn1_test.go中看到了证书示例 - 任何人都知道其他什么?)

(总的来说,我正在尝试在Go中实现一小部分LDAP(服务器端).)

更新:我的问题是因为LDAP使用BER而不是DER.所以encoding/asn.1无济于事.在任何情况下,我最终都这样做:https://github.com/bradleypeabody/godap(将其用于BER + ASN1:https://github.com/go-asn1-ber/asn1-ber)

asn.1 go

6
推荐指数
1
解决办法
3973
查看次数

模板不会将接口类型的字段评估为基础类型

使用golang html/template(与的行为相同text/template)。如果我有一个成员类型为接口类型的结构,则无法访问基础类型的成员(特别是尝试访问实现接口InnerInterface但通过InnerInterface接口类型(而不是结构类型)返回的结构上的字段) 。

http://play.golang.org/p/ZH8wSK83oM

package main

import "fmt"
import "os"
import "html/template"

type InnerInterface interface{ InnerSomeMethod() }

type MyInnerStruct struct { Title string }
func (mis MyInnerStruct)InnerSomeMethod() { fmt.Println("Just to show we're satisfying the interface") }

type MyOuterStruct struct { Inner InnerInterface }


func main() {

    fmt.Println("Starting")


    arg := MyOuterStruct{Inner:MyInnerStruct{Title:"test1"}}

    err := template.Must(template.New("testtmpl").Parse("{{.Inner.Title}}")).Execute(os.Stdout, arg)
    if err != nil { panic(err) }

}
Run Code Online (Sandbox Code Playgroud)

更改:更改type MyOuterStruct struct { Inner InnerInterface }为完全通用的接口,即使type MyOuterStruct …

struct field interface go

5
推荐指数
1
解决办法
2932
查看次数

“选择”的 BER 编码

我正在尝试使用 Apache Harmony ASN.1/BER 类解析 LDAP 绑定请求(可以使用另一个库,我只是选择它,因为它具有 Apache 许可证)。

我的问题是关于 ASN.1 中“CHOICE”的具体编码。定义 LDAP ASN.1 架构的 RFC ( http://www.rfc-editor.org/rfc/rfc2251.txt ) 提供以下内容作为绑定请求的一部分:

   BindRequest ::= [APPLICATION 0] SEQUENCE {
            version                 INTEGER (1 .. 127),
            name                    LDAPDN,
            authentication          AuthenticationChoice }

    AuthenticationChoice ::= CHOICE {
            simple                  [0] OCTET STRING,
                                     -- 1 and 2 reserved
            sasl                    [3] SaslCredentials }

    SaslCredentials ::= SEQUENCE {
            mechanism               LDAPString,
            credentials             OCTET STRING OPTIONAL }
Run Code Online (Sandbox Code Playgroud)

那里的 CHOICE 实际上是如何编码的?

我使用 JXplorer 生成了一个示例绑定请求并捕获了发送的原始数据。它看起来像这样:

00000000  30 31 02 01 01 60 2c 02  01 …
Run Code Online (Sandbox Code Playgroud)

ldap asn.1

4
推荐指数
1
解决办法
3758
查看次数

使用String()方法转到接口

标准库中是否有Go接口:

String() string
Run Code Online (Sandbox Code Playgroud)

(类似于java在java.lang.Object上的toString()方式)

也许我只是没有足够的搜索,但我没有看到一个.想要使用一个已经存在的而不是自己制作的(虽然我猜它与Go的类型系统没有任何区别).

string tostring go

4
推荐指数
1
解决办法
401
查看次数

去购买/财务计算的类型

我正在Go建立一个在线商店.正如所料,一些重要的部分需要记录确切的货币金额.我知道与浮点数相关的舍入问题(即0.3无法准确表示等).

货币的概念似乎很容易表现为一个字符串.但是,我不确定哪种类型最适合表达实际的货币金额.

关键要求似乎是:

  • 根据货币(某些货币使用超过2位小数位:http://www.londonfx.co.uk/ccylist.html),可以精确地将十进制数表示为指定的小数位数
  • 显然需要基本的算术运算 - add/sub/mul/div.
  • Sane字符串转换 - 这实际上意味着转换为十进制等值.此外,国际化至少是可能的,即使所有的逻辑都没有建立(欧洲为1.000,美国为1,000).
  • 舍入,可能使用像Banker四舍五入的替代舍入方案.
  • 需要有一种简单明了的方法来对应数据库值 - 在我的情况下是MySQL.(可能最有意义的是将值视为此级别的字符串,以确保其值保持准确.)

我知道math/big.Rat它似乎解决了很多这些问题,但是例如它的字符串输出将无法正常工作,因为它将以"a/b"形式输出.我确信也有解决方案,但我想知道是否存在某种现有的最佳实践,我不知道(无法轻易找到)这类事情.

更新:这个包看起来很有希望:https://code.google.com/p/godec/

bigdecimal go financial

4
推荐指数
1
解决办法
1242
查看次数

是否有一个git命令来创建一个分支,切换到它,并将它链接到它的远程对应物?

现在,当我想快速修复我的项目时,我这样做:

# create and switch to this new branch
git checkout -b fixes-20130828-01
# push the new branch back to the origin
git push origin fixes-20130828-01
# link local and remote branches
git --set-upstream fixes-20130828-01 origin/fixes-20130828-01 
Run Code Online (Sandbox Code Playgroud)

我希望能够通过以下方式完成上述操作:

# is there a way to get this to not only create and switch locally,
# but also to link to remote
git checkout --[something] fixes-20130828-01
# and then this would do the actual push to create
# the branch on the origin, …
Run Code Online (Sandbox Code Playgroud)

git branch git-branch

3
推荐指数
1
解决办法
119
查看次数

从网页访问golang http + jsonrpc

我已经使用Go net/rpcnet/rpc/jsonrpc打包了一些代码来执行Go进程之间的连接,但是我想知道是否有一种方法可以仅使用标准库中的服务器工具来连接到HTTP JSONRPC服务器(这不是我编写时遇到的问题)我自己的,就是如果我不需要的话就不想做)。

这是我的基本服务器设置:

arith := new(server.Arith)

server := rpc.NewServer()
server.Register(arith)

server.HandleHTTP(rpc.DefaultRPCPath, rpc.DefaultDebugPath)

listener, e := net.Listen("tcp", ":4321")
if e != nil {
    log.Fatal("listen error:", e)
}
defer listener.Close()

http.Serve(listener, http.DefaultServeMux)
Run Code Online (Sandbox Code Playgroud)

而且,我希望能够从网页或简单的命令行CURL调用-只需常规POST中就能实现。

但是,以下行:http : //golang.org/src/net/rpc/server.go?s=20445 : 20475#L670似乎表明它期望HTTP客户端发出CONNECT,然后直接编写JSON RPC向流发送请求并以相同方式接收回复。我不知道这是否可以通过浏览器实现,但是它肯定不像简单的POST那样普遍或兼容。

有没有一种方法可以启动JSON RPC服务器,而我可以使用良好的XMLHttpRequest开机自检?

编辑:废话-上面甚至没有使用jsonrpc的东西-这可能是试图使用Gob,但是无论如何-问题是相同的-src / net / rpc / server.go中的代码将无法处理POST,因此,无论服务器编解码器如何,此路由总体上都不会起作用。

json json-rpc go

3
推荐指数
1
解决办法
1665
查看次数

如何在 Go 中读取 JSON 对象而不对其进行解码(用于读取大流)

我正在读取 JSON 来响应 HTTP 端点,并希望提取嵌套在其中的对象数组的内容。响应可能很大,因此我尝试使用流式传输方法,而不仅仅是 json.Unmarshal'ing 整个内容。JSON 看起来像这样:

{
"useless_thing_1": { /* etc */ },
"useless_thing_2": { /* etc */ },
"the_things_i_want": [
  { /* complex object I want to json.Unmarshal #1 */ },
  { /* complex object I want to json.Unmarshal #2 */ },
  { /* complex object I want to json.Unmarshal #3 */ },
  /* could be many thousands of these */
],
"useless_thing_3": { /* etc */ },
}
Run Code Online (Sandbox Code Playgroud)

Go 提供的 json 库json.Unmarshal非常适合完整的 JSON 对象。它还 …

json decode stream go unmarshalling

2
推荐指数
1
解决办法
1516
查看次数

go xml解析"看不到"任何字段

我必须遗漏一些非常明显的东西...我试图解析一个简单的XML文件,遵循以下示例ExampleUnmarshal():http://golang.org/src/pkg/encoding/xml/example_test.go

正如您将在底部看到的那样,没有任何属性或子元素被映射 - 无论是方向 - Marshal还是Unmarshal.从我可以看出这几乎与他们在上面的example_test.go中所做的完全相同(我可以看到的唯一区别是该测试中的类型在函数的范围内 - 我尝试过,没有差异,并且他们正在使用子元素而不是属性 - 除了id- 但是根据文档名称,attr应该工作.

代码如下所示:

package main

import (
    "fmt"
    "encoding/xml"
    "io/ioutil"
)


type String struct {
    XMLName xml.Name `xml:"STRING"`
    lang  string   `xml:"lang,attr"`
    value  string   `xml:"value,attr"`
}

type Entry struct {
    XMLName xml.Name `xml:"ENTRY"`
    id      string  `xml:"id,attr"`
    strings []String 
}

type Dictionary struct {
    XMLName xml.Name `xml:"DICTIONARY"`
    thetype  string   `xml:"type,attr"`
    ignore  string   `xml:"ignore,attr"`
    entries []Entry  
}

func main() {

    dict := Dictionary{}

    b := …
Run Code Online (Sandbox Code Playgroud)

xml go xml-parsing

1
推荐指数
1
解决办法
169
查看次数

为什么我不能用反射来获取切片的地址?

为什么这样有效:

slice := make([]string, 0, 10)
sliceptr := &slice
Run Code Online (Sandbox Code Playgroud)

这个也是:

sliceptr := &[]string{"foo","bar","baz"}
Run Code Online (Sandbox Code Playgroud)

但这不是:

sliceaddrval := reflect.ValueOf([]string{"foo","bar","baz"}).Addr()
Run Code Online (Sandbox Code Playgroud)

它惊慌失措: reflect.Value.Addr of unaddressable value


编辑:总的来说,我正在尝试做的是采用一个未知类型的结构,制作一个该类型的结构,并返回一个指向它的指针(我正在使用github.com/jmoiron/modl,这需要一个指向切片的指针,以填充SQL查询的结果).

reflection go slice

1
推荐指数
1
解决办法
1143
查看次数