在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 …
我想通过TLS接收TCP连接.我想验证客户端证书并使用它来验证我的应用程序的客户端.Go有标准crypto/tls
包.它可以验证客户端/服务器证书.但是我找不到获取远程(客户端)证书详细信息的方法,比如通用名称.
我正在尝试使用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的文档?
有无效的字节序列无法转换为Unicode字符串.转换[]byte
到string
Go 时如何检测?
我正在寻找Go 中的Python bisect
模块的开箱即用的实现.我需要的只是找到一个位置,用于从左侧和右侧插入排序数组中的项目.
我知道实现背后的逻辑,但我不想重新发明它的所有边缘情况.
Go 1.5设法发布一个用Go编写的自举编译器.假设Go比C慢,而早期的Go编译器是用C编写的,那么自举编译器在编译时会变慢吗?
根据我对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
?
我正试图抓住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()
),它会打印两个空切片.为什么这不起作用?
不,这不是因为我的程序结束太快了.
我有这个脚本:
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)