小编two*_*two的帖子

指针与参数和返回值中的值

在Go中,有多种方法可以返回其struct值或片.对于我见过的个人:

type MyStruct struct {
    Val int
}

func myfunc() MyStruct {
    return MyStruct{Val: 1}
}

func myfunc() *MyStruct {
    return &MyStruct{}
}

func myfunc(s *MyStruct) {
    s.Val = 1
}
Run Code Online (Sandbox Code Playgroud)

我理解这些之间的差异.第一个返回结构的副本,第二个返回指向函数内创建的结构值的指针,第三个期望传入现有结构并覆盖该值.

我已经看到所有这些模式都在各种环境中使用,我想知道关于这些模式的最佳实践是什么.你什么时候用哪个?例如,第一个可能适用于小结构(因为开销很小),第二个适用于较大结构.第三个是你想要非常高效的内存,因为你可以在调用之间轻松地重用一个struct实例.有什么时候使用哪种最佳做法?

同样,关于切片的相同问题:

func myfunc() []MyStruct {
    return []MyStruct{ MyStruct{Val: 1} }
}

func myfunc() []*MyStruct {
    return []MyStruct{ &MyStruct{Val: 1} }
}

func myfunc(s *[]MyStruct) {
    *s = []MyStruct{ MyStruct{Val: 1} }
}

func myfunc(s *[]*MyStruct) {
    *s = []MyStruct{ &MyStruct{Val: 1} }
}
Run Code Online (Sandbox Code Playgroud)

再说一次:这里的最佳做法是什么.我知道切片总是指针,所以返回指向切片的指针是没用的.但是,如果我返回一片struct值,一块指向结构的指针,我应该将指向切片的指针作为参数传入(Go …

pointers go

295
推荐指数
4
解决办法
6万
查看次数

区别:LZ77与LZ4对比LZ4HC(压缩算法)?

我理解LZ77和LZ78算法.我在这里这里阅读了LZ4 并找到了代码.

这些链接描述了LZ4块格式.但如果有人可以解释(或指导我解释某些资源),那就太好了:

  • LZ4与LZ77有何不同?
  • LZ4HC与LZ4有什么不同?
  • 什么想法使LZ4HC算法如此之快?

lossless-compression lz4 lz77

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

在golang中获取远程ssl证书

我想通过TLS接收TCP连接.我想验证客户端证书并使用它来验证我的应用程序的客户端.Go有标准crypto/tls包.它可以验证客户端/服务器证书.但是我找不到获取远程(客户端)证书详细信息的方法,比如通用名称.

ssl go

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

LiteIDE x14可以工作吗?

我正在尝试使用LiteIDE for golang,没有文档可以说,显然没有论坛.我为我的环境设置了Env并进行安装.当我尝试在hello.go文件(作为文件或项目)上使用它时,我得到的是

<action id="Run" cmd="${TARGETPATH}" args="${TARGETARGS}">
<start=" " workdir="C:/liteide.projects"/>
?

<error msg="process failed to start" />

</action>
Run Code Online (Sandbox Code Playgroud)

(很抱歉格式化,但此论坛中的代码示例代码无法处理XML块.)

很多其他人都看到了同样的事情.

显示的TARGETPATH和TARGETARGS是什么?

有没有关于如何配置LiteIDE的文档?

go liteide

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

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

是否有Python的bisect模块的Go模拟?

我正在寻找Go 中的Python bisect模块的开箱即用的实现.我需要的只是找到一个位置,用于从左侧右侧插入排序数组中的项目.

我知道实现背后的逻辑,但我不想重新发明它的所有边缘情况.

go

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

Go 1.5的自举编译器比用C编写的Go 1.4编译器慢吗?

Go 1.5设法发布一个用Go编写的自举编译器.假设Go比C慢,而早期的Go编译器是用C编写的,那么自举编译器在编译时会变慢吗?

compiler-construction programming-languages go

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

通道是否为goroutine调度发送抢占点?

根据我对Go调度程序的理解,Go调度算法部分抢占:当goroutine调用函数或阻塞I/O时会发生goroutine切换.

向频道发送消息时是否发生了goroutine切换?

// goroutine A
ch <- message
// some additional code without function calls

// goroutine B
message := <- ch
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我希望ch <- message在切换到B之前执行A 之后的代码,这是否有保证?或者A在A发送消息后立即安排ch

scheduling channel go goroutine

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

没有看到goroutines预期的副作用

我正试图抓住goroutines.拿这个代码:

package main
import "fmt"

var (
    b1 []float64
    b2 []float64
)

func main() {
    go fill(&b1, 10)
    go fill(&b2, 10)

    fmt.Println(b1,b2)

    var s string
    fmt.Scanln(&s)
}

func fill(a *[]float64, n int) {
    for i:=0; i<n; i++ {
        *a = append(*a, rand.Float64()*100)
    }
}
Run Code Online (Sandbox Code Playgroud)

如你所见,我正试图填补两片.但是当以这种方式运行时(带go fill()),它会打印两个空切片.为什么这不起作用?

concurrency append go slice goroutine

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

为什么不推出我的goroutines?

不,这不是因为我的程序结束太快了.

我有这个脚本:

package main

import ("log"; "io/ioutil"; "strings")

const BASE_FILE_NAME = "abc_"

func mygoroutine(file_name string) {
    log.Println("In goroutine for file", file_name)
}


func get_file_names() []string {
  file_names := make([]string, 0)
  files, _ := ioutil.ReadDir("./")
  for _, file := range files {
      if strings.HasPrefix(file.Name(), BASE_FILE_NAME) {
        file_names = append(file_names, file.Name())
      }
  }

  return file_names
}

func main()  {
    file_names := get_file_names()
    for _, file_name := range file_names {
        log.Println("Now lunching goroutine for file", file_name)
        go mygoroutine(file_name)
    }

    log.Println("Finished launching.")

    for {} …
Run Code Online (Sandbox Code Playgroud)

go goroutine

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