小编Fli*_*mzy的帖子

如何使用错误的证书进行https请求?

说我想以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!

ssl https go

110
推荐指数
5
解决办法
10万
查看次数

函数调用中的"用作值"

在条件语句中评估函数时,调用函数的正确方法是什么?

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

104
推荐指数
1
解决办法
5万
查看次数

为什么我不能在Golang中用`copy()`复制一个切片?

我需要在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)

你可以去游乐场看看.那为什么我不能复制一片?

go slice

103
推荐指数
5
解决办法
8万
查看次数

静态链接只有一些库

在与GCC链接时,如何仅将某些特定库静态链接到我的二进制文件?

gcc ... -static ...尝试静态链接所有链接库,但我没有其中一些的静态版本(例如:libX11).

linker gcc static-libraries

99
推荐指数
6
解决办法
15万
查看次数

单值上下文中的多个值

由于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)

有没有办法直接访问第一个返回的变量?

error-handling return-value go multiple-return-values

97
推荐指数
4
解决办法
9万
查看次数

如果指向的文件被移动,那么Linux上的打开文件句柄会发生什么

如果指向文件同时获得Linux上的打开文件句柄会发生什么:

  • 搬走了 - >文件句柄是否保持有效?
  • 已删除 - >这是否会导致EBADF,表明文件句柄无效?
  • 替换为新文件 - >文件句柄是否指向此新文件?
  • 替换为新文件的硬链接 - >我的文件是否处理"关注"此链接?
  • 替换为新文件的软链接 - >我的文件句柄现在是否触及此软链接文件?

为什么我问这样的问题:我使用的是热插拔硬件(如USB设备等).可能发生的是,设备(及其/ dev /文件)被用户或另一个Gremlin重新附加.

处理这个问题的最佳做法是什么?

linux file-io file linux-kernel systems-programming

96
推荐指数
3
解决办法
4万
查看次数

有没有一种方法可以使用go语言生成UUID

我的代码看起来像这样:

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?

uuid go

96
推荐指数
11
解决办法
10万
查看次数

使用reflect,如何设置struct字段的值?

粗略的时间使用reflect包使用struct字段.特别是,还没弄清楚如何设置字段值.

type t struct { fi int; fs string }
var r t = t{ 123, "jblow" }
var i64 int64 = 456
  1. 得到字段的名称我 - 这似乎工作

    var field = reflect.TypeOf(r).Field(i).Name

  2. 获得字段i的值作为a)接口{},b)int - 这似乎有效

    var iface interface{} = reflect.ValueOf(r).Field(i).Interface()

    var i int = int(reflect.ValueOf(r).Field(i).Int())

  3. 设置字段的值i - 尝试一个 - 恐慌

    reflect.ValueOf(r).Field(i).SetInt( i64 )

    panic:reflect.Value·SetInt使用未导出字段获得的值

    假设它不喜欢字段名称"id"和"name",所以重命名为"Id"和"Name"

    a)这个假设是否正确?

    b)如果正确,认为没有必要,因为在同一个文件/包中

  4. 设置字段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 )

他还记录了字段名称必须是可导出的(以大写字母开头)

reflection go go-reflect

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

"[notice] child pid XXXX退出信号分段错误(11)"在apache error.log中

我正在使用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)

php apache error-logging cakephp

94
推荐指数
3
解决办法
17万
查看次数

Golang中的值接收器与指针接收器?

我很不清楚在哪种情况下我会想要使用值接收器而不是总是使用指针接收器.
要从文档中回顾一下:

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)

有人能告诉我一个值接收器明显比指针接收器更有意义的情况吗?或者我在基准测试中做错了什么,我是否忽略了其他因素?

pointers function go

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