小编The*_*hat的帖子

为什么go函数的定义不同?

我正在努力学习Go.当我以为我理解一个函数是什么,如何使用它并且想要进入接口时我就陷入了困境(来源 Go博客)

package main

import "fmt"

//define a Rectangle struct that has a length and a width
type Rectangle struct { 
   length, width int
}

//write a function Area that can apply to a Rectangle type
func (r Rectangle) Area() int {
   return r.length * r.width
}

func main() {
   r := Rectangle{length:5, width:3} //define a new Rectangle instance with values for its properties
   fmt.Println("Rectangle details are: ",r)  
   fmt.Println("Rectangle's area is: ", r.Area())
}
Run Code Online (Sandbox Code Playgroud)

为什么我们有 func (r Rectangle) Area() …

go

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

time.parse:为什么golang错误地解析时间?

我正在尝试解析一个字符串作为时间,但不幸的是得到错误的月份(1月而不是6月)

package main

import "fmt"
import "time"

func main() {

    t := "2014-06-23T20:29:39.688+01:00"
    tc, _ := time.Parse("2006-01-02T15:04:05.000+01:00", t)

    fmt.Printf("t was %v and tc was %v", t, tc)

}
Run Code Online (Sandbox Code Playgroud)

time go

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

如何在结构上定义可变参数字段?走

除了自定义字段外,我还需要一个数据结构,它可以接受名称/值对。如何定义这样的结构?

例如

type mybasket struct {
    Coupons string
    Amount int
    ....... // string or int
}
Run Code Online (Sandbox Code Playgroud)

types go

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

Go 生成转义字符

我有一个 go generate 指令,如下所示:

//go:generate myprog -someName thisname -data 'Request: Typ "." callMe, Rsp:  MyTyp "." close'
Run Code Online (Sandbox Code Playgroud)

问题是程序只接收-someName标志值(“thisname”)。我认为由于-data某些原因该标志被丢弃。知道为什么吗?如果我直接从命令行执行程序,它就可以工作,所以我猜这是一个特定于 go 的问题。

go

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

如何修复没有标题的zlib文件?

我需要解压缩一个用 zlib 压缩的 git 对象。尽管该对象是用 zlib 压缩的,但它没有标头(我猜是为了节省带宽)。所以我试图在对象字节的顶部添加标头,但由于某些原因,zlib 仍然抱怨标头无效。我怀疑标题字节是作为字符串文字而不是字节添加的,但我不确定。请参阅下面的代码。

package main

import(
        "compress/zlib"
        "io/ioutil"
        "bytes"
        "fmt"
        //      "strings"
)


func main(){
        b, err := ioutil.ReadFile("raw")
        if err !=nil{
                panic(err)
        }
        const header = "\x1f\x8b\x08\x00\x00\x00\x00\x00"
        buf := bytes.NewBuffer(nil)
        if _, err := buf.WriteString(header); err !=nil{
                panic(err)
        }
        if _, err := buf.Write(b); err !=nil{
                panic(err)
        }
        r, err := zlib.NewReader(buf)
        if err !=nil{
                panic(err)
        }
        defer r.Close()
        var db []byte
        if _, err := r.Read(db); err !=nil{
                panic(err)
        }
        fmt.Printf("%s", db)
} …
Run Code Online (Sandbox Code Playgroud)

zlib go

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

如何在运行 AppEngine 的 Go 服务器生成的响应中设置 HTTP 标头?

我正在尝试使用 golang 和 google app engine 设置标头。下面是简单代码的样子:

w.Header().Set("Content-Type", "application/xml")
w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("header-name", "value")
Run Code Online (Sandbox Code Playgroud)

它似乎无法在我的开发服务器上运行。我总是得到通常的标题和

content-type:text/plain; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

当我部署时我得到

Content-Type:text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

我做错了吗还是这是一个错误(另一个)?

google-app-engine go

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

为什么我从封闭的渠道接收价值?

我正在调查频道的行为,他们的行为让我很困惑。规范说,After calling close, and after any previously sent values have been received, receive operations will return the zero value for the channel's type without blocking.但是,即使到那个时候通道关闭了,我似乎仍然能在range语句中得到这些值。这是为什么?

package main

import "fmt"
import "sync"
import "time"

func main() {
    iCh := make(chan int, 99)
    var wg sync.WaitGroup
    go func() {
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                iCh <- i
            }(i)

        }
        wg.Wait()
        close(iCh)
    }()
    time.Sleep(5 * time.Second)
    print("the channel should be …
Run Code Online (Sandbox Code Playgroud)

concurrency go

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

如何使用反射制作地图指针?

我需要使用反射包将指向映射的指针传递给另一个函数。想想 encoding/json.Unmarshal 只接受指针。下面是我需要使用反射做的一些代码:

  myTyp := &MyType{}
  json.Unmarshal(jsonPayload1, myTyp)
  m := make(map[string]*MyType)
  m["someKey"] = myTyp
  // Dump it again to Unmarshal. It will overwrite it only if 
  // there is a `someKey` key.
  x := json.Unmarshal(jsonPayload2, &m)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有以下几点:

  ....
  m := reflect.MakeMap(reflect.MapOf(reflect.TypeOf(""), reflect.TypeOf(typ))
  x := json.Unmarshal(jsonPayload2, m.Interface())
Run Code Online (Sandbox Code Playgroud)

此代码的问题在于它正在制作 map[string]MyType 的地图,但我无法为其创建指针。如果我尝试直接创建指针 [2],它会因reflect.MakeMap of non-map type.

为什么必须分配地图:

我需要分配的地图,以便我可以在特定键上设置 myTyp。myTyp 是使用多个解码源解码的,所以我不知道每个源解码了哪些字段,但我知道 Unmarshal 只覆盖与 json 内容/键匹配的键,因此可以安全地将相同的变量用于多个 Unmarshal 函数。

[2] reflect.MakeMap(reflect.PtrTo(reflect.MapOf(reflect.TypeOf("")), reflect.TypeOf(typ))

reflection go

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

`size*= b - a`是什么意思?

我发现了以下符号size *= b - a.我用反射检查了它,但似乎大小只是一个float64(a,b也是浮点数)所以我的问题是什么*?我希望它取消引用一个指针(大小)但它似乎不是案子.

go

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

我可以仅部分解码JSON(golang)吗?

我有一个非常复杂的json文档,但我只需要解码一个字符串locationx.我想知道是否有可能只解码一个特定的字段(按名称匹配),而不是为整个文档编写结构.我已经看到,即使结构与100%的文档结构不匹配,有时它也能解码json文档.

go

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

如何检测接口{}是否为指针?

我想知道你怎么知道接口是否是类型指针.

package main

import "fmt"
import "reflect"

type str struct {
    a, b string
}

func main() {
    var s str
    x := &s
    t := reflect.TypeOf(interface{}(x))
    fmt.Printf("%v", t.Size())
}
Run Code Online (Sandbox Code Playgroud)

pointers go

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

直接在源代码中使用gobs,是否可能?

我想知道是否可以直接在源代码中使用gob编码数据(例如在函数中).原因是不必访问磁盘来获取gob文件来提高性能.我知道memcached,redis和朋友.我不需要TTL或任何其他奇特的功能.只是在内存中映射.数据将在"设置"/构建过程中编码并转储到源代码中,以便在运行时只需要"解码"它.

go应用程序基本上可以作为一个小的只读嵌入式数据库.我可以使用json(基本上用原始json声明一个var)来做到这一点,但我想会有性能损失所以我想知道它是否可能与gob.

我尝试了不同的东西,但我不能让它工作,因为基本上我不知道如何定义gob var(字节,[字节] ??)和解码器似乎期望一个io.Reader所以在开支之前整整一天,我决定至少问你这个问题.

悲惨的尝试:

var test string
test = "hello"

p := new(bytes.Buffer)
e := gob.NewEncoder(p)
e.Encode(test)
ers := ioutil.WriteFile("test.gob", p.Bytes(), 0600)
if ers != nil {
    panic(ers)
}
Run Code Online (Sandbox Code Playgroud)

现在我想将test.gob添加到函数中.正如我所看到的,test.gob的源代码如下^H^L^@^Ehello

var test string

var b bytes.Buffer

b = byte("^H^L^@^Ehello")

de := gob.NewDecoder(b.Bytes())

er := de.Decode(&test)
if er != nil {
    fmt.Printf("cannot decode")
    panic(er)
}

fmt.Fprintf(w, test)
Run Code Online (Sandbox Code Playgroud)

performance go gob

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

为什么范围内没有帖子?Golang

我想在每个范围循环后增加一个变量.然而,似乎不可能使用标准( for init; condition; post { })语法,因此我想知道为什么.这就是我想要做的

    for item := range itemsList; page++ {

}
Run Code Online (Sandbox Code Playgroud)

似乎唯一的办法就是这样做

        for item := range itemsList{

       page++
    }
Run Code Online (Sandbox Code Playgroud)

这看起来不像第一个那么好.

go

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