说我想以https://golang.org编程方式获得.目前golang.org(ssl)有一个错误的证书,*.appspot.com当我运行时,它发布给了:
package main
import (
"log"
"net/http"
)
func main() {
_, err := http.Get("https://golang.org/")
if err != nil {
log.Fatal(err)
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了(正如我所料)
Get https://golang.org/: certificate is valid for *.appspot.com, *.*.appspot.com, appspot.com, not golang.org
Run Code Online (Sandbox Code Playgroud)
现在,我想自己信任这个证书(想象一下我可以验证指纹等的自发证书):我如何提出请求并验证/信任证书?
我可能需要使用openssl下载证书,将其加载到我的文件中并填充tls.Configstruct!
在条件语句中评估函数时,调用函数的正确方法是什么?
package main
import "fmt"
func main(){
if sumThis(1,2) > sumThis(3,4){
fmt.Println("test")
} else {
fmt.Println("derp")
}
}
func sumThis(a, b int){
return a+b
}
Run Code Online (Sandbox Code Playgroud)
这会返回错误:
./test4.go:4: sumThis(1, 2) used as value
./test4.go:4: sumThis(3, 4) used as value
./test4.go:11: too many arguments to return
Run Code Online (Sandbox Code Playgroud)
你怎么用Go写的?
我需要在Go中复制一个切片并阅读文档,我可以使用复制功能.
复制内置函数将元素从源切片复制到目标切片.(作为一种特殊情况,它还会将字符串中的字节复制到一个字节片段.)源和目标可能重叠.Copy返回复制的元素数,这将是len(src)和len(dst)的最小值.
但当我这样做时:
arr := []int{1, 2, 3}
tmp := []int{}
copy(tmp, arr)
fmt.Println(tmp)
fmt.Println(arr)
Run Code Online (Sandbox Code Playgroud)
我tmp以前是空的(我甚至试图使用arr, tmp):
[]
[1 2 3]
Run Code Online (Sandbox Code Playgroud)
你可以去游乐场看看.那为什么我不能复制一片?
在与GCC链接时,如何仅将某些特定库静态链接到我的二进制文件?
gcc ... -static ...尝试静态链接所有链接库,但我没有其中一些的静态版本(例如:libX11).
由于Go中的错误处理,我经常最终得到多个值函数.到目前为止,我管理它的方式非常混乱,我正在寻找编写更清晰代码的最佳实践.
假设我有以下功能:
type Item struct {
Value int
Name string
}
func Get(value int) (Item, error) {
// some code
return item, nil
}
Run Code Online (Sandbox Code Playgroud)
如何item.Value优雅地分配新变量.在介绍错误处理之前,我的函数刚刚返回item,我可以简单地执行此操作:
val := Get(1).Value
Run Code Online (Sandbox Code Playgroud)
现在我这样做:
item, _ := Get(1)
val := item.Value
Run Code Online (Sandbox Code Playgroud)
有没有办法直接访问第一个返回的变量?
如果指向文件同时获得Linux上的打开文件句柄会发生什么:
为什么我问这样的问题:我使用的是热插拔硬件(如USB设备等).可能发生的是,设备(及其/ dev /文件)被用户或另一个Gremlin重新附加.
处理这个问题的最佳做法是什么?
我的代码看起来像这样:
u := make([]byte, 16)
_, err := rand.Read(u)
if err != nil {
return
}
u[8] = (u[8] | 0x80) & 0xBF // what does this do?
u[6] = (u[6] | 0x40) & 0x4F // what does this do?
return hex.EncodeToString(u)
Run Code Online (Sandbox Code Playgroud)
它返回一个长度为32的字符串,但我不认为它是一个有效的UUID.如果它是一个真正的UUID,为什么它是一个UUID,什么是修改的值的代码的目的u[8]和u[6].
有没有更好的方法来生成UUID?
粗略的时间使用reflect包使用struct字段.特别是,还没弄清楚如何设置字段值.
type t struct { fi int; fs string }
var r t = t{ 123, "jblow" }
var i64 int64 = 456
得到字段的名称我 - 这似乎工作
var field = reflect.TypeOf(r).Field(i).Name
获得字段i的值作为a)接口{},b)int - 这似乎有效
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
设置字段的值i - 尝试一个 - 恐慌
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic:reflect.Value·SetInt使用未导出字段获得的值
假设它不喜欢字段名称"id"和"name",所以重命名为"Id"和"Name"
a)这个假设是否正确?
b)如果正确,认为没有必要,因为在同一个文件/包中
设置字段i的值 - 尝试两个(字段名称大写) - 恐慌
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
恐慌:反映.值/ SetInt使用不可寻址的值
@peterSO下面的说明是彻底和高质量的
四.这工作:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
他还记录了字段名称必须是可导出的(以大写字母开头)
我正在使用Apache/PHP/MySQL堆栈.
使用CakePHP作为框架.
我偶尔会得到一个空白的白页.我无法通过Cake调试它,所以我偷看了apache error.log,这就是我得到的:
[Wed Oct 12 15:27:23 2011] [notice] child pid 3580 exit signal Segmentation fault (11)
[Wed Oct 12 15:27:34 2011] [notice] child pid 3581 exit signal Segmentation fault (11)
[Wed Oct 12 15:30:52 2011] [notice] child pid 3549 exit signal Segmentation fault (11)
[Wed Oct 12 16:04:27 2011] [notice] child pid 3579 exit signal Segmentation fault (11)
zend_mm_heap corrupted
[Wed Oct 12 16:26:24 2011] [notice] child pid 3625 exit signal Segmentation fault (11)
[Wed Oct 12 17:57:24 …Run Code Online (Sandbox Code Playgroud) 我很不清楚在哪种情况下我会想要使用值接收器而不是总是使用指针接收器.
要从文档中回顾一下:
type T struct {
a int
}
func (tv T) Mv(a int) int { return 0 } // value receiver
func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver
Run Code Online (Sandbox Code Playgroud)
该文档还表示"对于类型,如基本类型,切片和小结构,值接收机是非常便宜,所以,除非所述方法的语义需要一个指针,一个值是接收机有效和明确的."
首先它说它"非常便宜",但更问题的是它比指针接收器便宜.所以我做了一个小的基准测试(gist上的代码)向我展示了,即使对于只有一个字符串字段的结构,指针接收器也更快.这些是结果:
// Struct one empty string property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 500000000 3.62 ns/op
// Struct one zero int property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 2000000000 0.36 ns/op
Run Code Online (Sandbox Code Playgroud)
(编辑:请注意第二点在较新的版本中无效,请参阅注释).
第二点它说,它是"高效和清晰",这更多的是品味问题,不是吗?就个人而言,我喜欢以任何方式使用相同的方式.效率在什么意义上?性能方面看来,指针几乎总是更有效率.使用一个int属性的少量测试运行显示Value接收器的最小优势(范围为0.01-0.1 ns/op)
有人能告诉我一个值接收器明显比指针接收器更有意义的情况吗?或者我在基准测试中做错了什么,我是否忽略了其他因素?
go ×7
apache ×1
cakephp ×1
file ×1
file-io ×1
function ×1
gcc ×1
go-reflect ×1
https ×1
linker ×1
linux ×1
linux-kernel ×1
php ×1
pointers ×1
reflection ×1
return-value ×1
slice ×1
ssl ×1
uuid ×1