小编icz*_*cza的帖子

如何让客户端在下载文件时打开保存文件对话框

我希望浏览器显示或打开文件保存对话框,以保存用户单击下载文件按钮时发送的文件。

我的服务器端下载代码:

func Download(w http.ResponseWriter, r *http.Request) {
    url := "http://upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png"

    timeout := time.Duration(5) * time.Second
    transport := &http.Transport{
        ResponseHeaderTimeout: timeout,
        Dial: func(network, addr string) (net.Conn, error) {
            return net.DialTimeout(network, addr, timeout)
        },
        DisableKeepAlives: true,
    }
    client := &http.Client{
        Transport: transport,
    }
    resp, err := client.Get(url)
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()

    //copy the relevant headers. If you want to preserve the downloaded file name, extract it with go's url parser.
    w.Header().Set("Content-Disposition", "form-data; filename=Wiki.png")
    w.Header().Set("Content-Type", r.Header.Get("Content-Type"))
    w.Header().Set("Content-Length", …
Run Code Online (Sandbox Code Playgroud)

http download go web

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

释放未使用的内存?

我正在使用以下功能下载小于20MB的文件.它将整个内容读取到内存中,因为另一个函数必须在将字节写入磁盘之前对字节执行操作.

func getURL(url string) ([]byte, error) {
    resp, err := http.Get(url)
        if err != nil {
            return nil, fmt.Errorf("getURL: %s", err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
            return nil, fmt.Errorf("getURL: %s", err)
    }

    return body, nil
}
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但系统会消耗所有内存.

是否可以释放body由其他函数处理后使用的内存,因此内存使用量不会大于当前正在处理的字节数?

memory garbage-collection http go server

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

单值上下文中的多值strconv.ParseInt()

我有以下代码:

var i2 uint64;
var err error;
i2, err = uint64(strconv.ParseInt(scanner.Text(), 64, 64));
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

multiple-value strconv.ParseInt() in single-value context
Run Code Online (Sandbox Code Playgroud)

根据我在互联网上找到的所有内容,这意味着我忽略了ParseInt返回的两个参数,但我使用的是错误的.我知道也许错误是非常愚蠢的,但我刚开始学习Go,这让我很困惑.

parsing type-conversion go

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

使用自定义类型实现接口而不导入包

假设有一个第三方软件包使接口可用:

package giantpackage

type UselessInfo struct {
    wontUse     string
    alsoWontUse string
}

type CoolInterface interface {
    DoSomethingAwesome(ui UselessInfo) (string, error)
}
Run Code Online (Sandbox Code Playgroud)

这样做似乎很容易实现:

package main

import giantpackage

type Jedi struct {
    name string
    age  int
}

func (j Jedi) DoSomethingAwesome(ui giantpackage.UselessInfo) (string, error)
    return "Hello world.", nil
}
Run Code Online (Sandbox Code Playgroud)

假设:
1)我实际上并没有在DoSomethingAwesome函数中使用UselessInfo结构.
2)我必须导入的包是巨大的.
3)我必须导入的包不再维护,不能修改.

我的问题:
有没有办法在不导入Giantpackage的情况下实现CoolInterface?

types interface go

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

Go,将数据传递到通道

我有一个问题。这是示例:https: //play.golang.org/p/QSWY2INQuSE

func Avg(c chan string, wg *sync.WaitGroup) {
    defer wg.Done()
    c <- "test"
}

func main() {
    var wg sync.WaitGroup
    c := make(chan string)

    timer1 := time.NewTicker(5 * time.Second)

    for {
        select {
        case <-timer1.C:
            wg.Add(1)
            go Avg(c, &wg)
            wg.Wait()
        }
    }
    fmt.Println(<-c)
}
Run Code Online (Sandbox Code Playgroud)

为什么数据达不到fmt.Println(<-c)

谢谢你!

concurrency channel go goroutine

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

如何在JSON中自定义封送映射键

我无法理解的自定义元帅的一个奇怪的行为intstring.

这是一个例子:

package main

import (
    "encoding/json"
    "fmt"
)

type Int int

func (a Int) MarshalJSON() ([]byte, error) {
    test := a / 10
    return json.Marshal(fmt.Sprintf("%d-%d", a, test))
}

func main() {

    array := []Int{100, 200}
    arrayJson, _ := json.Marshal(array)
    fmt.Println("array", string(arrayJson))

    maps := map[Int]bool{
        100: true,
        200: true,
    }
    mapsJson, _ := json.Marshal(maps)
    fmt.Println("map wtf?", string(mapsJson))
    fmt.Println("map must be:", `{"100-10":true, "200-20":true}`)
}
Run Code Online (Sandbox Code Playgroud)

输出是:

array ["100-10","200-20"]
map wtf? {"100":true,"200":true}
map must be: {"100-10":true, "200-20":true}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/iiUyL2Hc5h_P

我错过了什么?

string json dictionary go slice

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

Golang 替换任何和所有换行符

通常,当我替换换行符时,我会跳转到 Regexp,就像在这个 PHP 中一样

preg_replace('/\R/u', "\n", $String);
Run Code Online (Sandbox Code Playgroud)

因为我知道这是一种非常耐用的方法来替换任何类型的 Unicode 换行符(无论是 \n、\r、\r\n 等)

我也试图在 Go 中做这样的事情,但我得到了

解析正则表达式时出错:转义序列无效: \R

在这条线上

msg = regexp.MustCompilePOSIX("\\R").ReplaceAllString(html.EscapeString(msg), "<br>\n")
Run Code Online (Sandbox Code Playgroud)

我尝试(?:(?>\r\n)|\v)/sf/answers/307242001/使用,但看起来 Go 的正则表达式实现也不支持,恐慌invalid or unsupported Perl syntax: '(?>'

在 Go、Regex 中替换换行符的好、安全方法是什么?


我在这里看到这个答案Golang: Issues replace newlines in a string from a text file say to use \r?\n,但我不敢相信它会得到所有的Unicode 换行符,主要是因为这个问题的答案列出了更多的换行符代码点\r?\n涵盖的 3 个,

regex string go

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

如何保护服务免受 gzip 炸弹的攻击?

我有test.gzipjson文件

{"events": [
{"uuid":"56c1718c-8eb3-11e9-8157-e4b97a2c93d3",
"timestamp":"2019-06-14 14:47:31 +0000",
"number":732,
"user": {"full_name":"0"*1024*1024*1024}}]}
Run Code Online (Sandbox Code Playgroud)

full_name 文件包含 1GB 的0压缩文件大小 ~1Mb

如何在解包过程中保护我的服务,使我的记忆不会结束?

func ReadGzFile(filename string) ([]byte, error) {
    fi, err := os.Open(filename)
    if err != nil {
        return nil, err
    }
    defer fi.Close()

    fz, err := gzip.NewReader(fi)
    if err != nil {
        return nil, err
    }
    defer fz.Close()

    s, err := ioutil.ReadAll(fz)
    if err != nil {
        return nil, err
    }
    return s, nil
}

func main() {
    b, err := ReadGzFile("test.gzip") …
Run Code Online (Sandbox Code Playgroud)

security json gzip http go

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

如何用地图替换多个“ if-else-if”

我在多层if-else-if条件上遇到了一个问题,因此我想通过使用地图进行简短说明。

请在if-else-if中查看以下代码,以将其替换为地图。

function, args := APIstub.GetFunctionAndParameters()

if function == "queryProduce" {
    return s.queryProduce(APIstub, args)
} else if function == "initLedger" {
    return s.initLedger(APIstub)
} else if function == "createProduce" {
    return s.createProduce(APIstub, args)
} else if function == "queryAllProduces" {
    return s.queryAllProduces(APIstub)
} else if function == "changeProduceStatus" {
    return s.changeProduceStatus(APIstub, args)
}

return shim.Error("Invalid Smart Contract function name.")
}
Run Code Online (Sandbox Code Playgroud)

dictionary if-statement go

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

如何将map [string] int切片成块

我的目标是获取一个map[string]int可能包含多达一百万个条目的条目并将其分块,最大尺寸为500,然后将地图发布到外部服务。我刚接触golang,所以现在暂时在Go Playground中进行修改。

任何人关于如何提高我的代码库效率的任何提示,请分享!

游乐场:https : //play.golang.org/p/eJ4_Pd9X91c

我看到的CLI输出是:

original size 60
chunk bookends 0 20
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
chunk bookends 20 40
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
chunk bookends 40 60
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
Run Code Online (Sandbox Code Playgroud)

这里的问题是,虽然正确地计算了块书挡,但是x每次该值都从0开始。我想我应该期望它从最小块书挡开始,即0、20、40等。 范围为何每次都从零开始?

资源:

package main

import (
    "fmt"
    "math/rand"
    "strconv"
)

func main() {
    items := make(map[string]int)

    // Generate some fake data for our testing, in reality this could be 1m entries
    for i := 0; i < 60; i ++ {
        // int as strings are intentional here
        items[strconv.FormatInt(int64(rand.Int()), …
Run Code Online (Sandbox Code Playgroud)

dictionary go slice

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