我希望浏览器显示或打开文件保存对话框,以保存用户单击下载文件按钮时发送的文件。
我的服务器端下载代码:
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) 我正在使用以下功能下载小于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由其他函数处理后使用的内存,因此内存使用量不会大于当前正在处理的字节数?
我有以下代码:
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,这让我很困惑.
假设有一个第三方软件包使接口可用:
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?
我有一个问题。这是示例: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)
谢谢你!
我无法理解的自定义元帅的一个奇怪的行为int来string.
这是一个例子:
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
我错过了什么?
通常,当我替换换行符时,我会跳转到 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 个,
我有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) 我在多层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) 我的目标是获取一个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)