小编Fli*_*mzy的帖子

Go是否按值或作为指针将对象存储在map中?

我有以下地图:

var conns map[string]Conn
Run Code Online (Sandbox Code Playgroud)

如您所知,Conn是自定义类型。正如声明所示,我的地图存储了Conn类型的值。为了将它们存储在地图中,我这样做:

conns["127.0.0.1"] = Conn{}
Run Code Online (Sandbox Code Playgroud)

但是我的问题是Go是在底层存储了指向Conn对象的指针还是实际上存储了值?

go

-3
推荐指数
1
解决办法
84
查看次数

压缩的JSON大于未压缩的版本

我会尽力解决我的问题。

myJSON是一个简单的JSON字符串。 len(myJSON)= 78

e是 json.Marshal(myJSON)

据我了解,e现在是 []byte

然后我像这样压缩:

var buf bytes.Buffer
gz := gzip.NewWriter(&buf)
gz.Write(e)
gz.Close()
Run Code Online (Sandbox Code Playgroud)

buf.Len()= 96

那么...为什么我的压缩缓冲区比原始的非压缩字符串大?

编辑:当某人试图了解为什么正在发生某事时,投下一个问题的巨魔很搞笑。猜猜我应该盲目接受它,而不要问。

json gzip go

-3
推荐指数
2
解决办法
141
查看次数

Java8 vs Go执行速度

我正在学习Go,在此之前我一直在使用Java8。我编写了两个程序来比较Java8和Go之间的执行速度。

Java程序运行了604秒,Go运行了2334.598334749秒。有人可以帮我理解为什么Go程序即使据说运行速度更快也运行缓慢。

?  ~ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
?  ~ go version
go version go1.12.4 darwin/amd64
Run Code Online (Sandbox Code Playgroud)
?  ~ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
?  ~ go version
go version go1.12.4 darwin/amd64
Run Code Online (Sandbox Code Playgroud)
//Java
public class Solution {

  public static void main(String[] args) {

    long start = System.currentTimeMillis();
    for (int i …
Run Code Online (Sandbox Code Playgroud)

java go

-3
推荐指数
1
解决办法
106
查看次数

无法推迟关闭请求正文

知道为什么我无法关闭请求正文吗?请求返回200且没有错误,但是req.Body.Close()抛出运行时错误:无效的内存地址或nil指针取消引用

clientHttp := &http.Client{}

req, err := http.NewRequest("GET", "https://example.com/item/"+strconv.FormatInt(itemID, 10), nil)
  if err != nil {
    logrus.Error(err)
    return models.Company{}, err
  }
resp, err := clientHttp.Do(req)
 if err != nil {
    logrus.Error(err)
    return models.Company{}, err
 }

defer req.Body.Close() // <- panic!
Run Code Online (Sandbox Code Playgroud)

request go

-3
推荐指数
1
解决办法
63
查看次数

为什么 Go 中的错误可以为 null?

Go 中的错误可能为零。编译如下:

   var err error
   err = nil 
   err = errors.New("hello")
Run Code Online (Sandbox Code Playgroud)

然而错误是值,并且值类型在 Go 中不可为空。

看了一下error,是一个普通的界面:

type error interface {
    Error() string
}
Run Code Online (Sandbox Code Playgroud)

由该结构体实现:

type errorString struct {
    s string
}
Run Code Online (Sandbox Code Playgroud)

这里没有指点。有一种方法需要一个指针接收器,

func (e *errorString) Error() string {
    return e.s
}
Run Code Online (Sandbox Code Playgroud)

但这并不能解释为什么它error表现为指针而不是值。

errors.New()确实返回一个指针,

func New(text string) error {
    return &errorString{text}
}
Run Code Online (Sandbox Code Playgroud)

这使得我上面的第三行代码更加令人费解——我们将 的结果分配New给一个值变量。

这是如何运作的?

error-handling null interface go

-3
推荐指数
1
解决办法
473
查看次数

如何使用接口填充切片?

我知道我可以用字符串填充 Go 切片strings := []string{"something", "something else"},但是除了接口之外我怎么能做同样的事情呢?我尝试了以下方法:

data := []interface{}{{ID: "123"}, {ID: "456"}}
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

missing type in composite literal
Run Code Online (Sandbox Code Playgroud)

我也尝试使用这样的结构:

type Users struct {
    ID string
}

[]Users{{ID: "123"}, {ID: "456"}}
Run Code Online (Sandbox Code Playgroud)

哪个有效,但是mongoInsertMany函数需要一个[]interface{}参数:

cannot use users (type []Users) as type []interface {} in argument to database.InsertMany
Run Code Online (Sandbox Code Playgroud)

我如何定义和填充一个[]interface{}

interface go slice

-3
推荐指数
1
解决办法
121
查看次数

从抽象结构转换为具体结构

我在 Go 中遇到了一个轻微但很烦人的问题。我有一个用于项目的抽象结构,然后我将其用于具体结构。下面是一个例子:

type Abstract struct {
  ID uint64
  Name string

  Update func()
}

type Concrete struct {
  Abstract
  Description string
}
Run Code Online (Sandbox Code Playgroud)

当我使用我的对象时,我总是使用抽象结构(考虑到我有大约 10 个基于它的具体结构)。一个例子:

func DoSomething(abstract Abstract) {
}
Run Code Online (Sandbox Code Playgroud)

但是...假设我想访问在具体结构上定义的属性/函数。我将如何从抽象结构转换为具体结构?

我试过这个:

concr, valid := abstract.(*Concrete)
Run Code Online (Sandbox Code Playgroud)

但这要求抽象结构是一个接口,但它不能是一个接口,因为那些不允许属性/变量。

有什么办法可以解决这个问题吗?我看到的唯一方法会让我很头疼,那就是将 Abstract 变成一个接口,然后让我的所有具体对象自己定义属性/变量。那里有很多重复的代码,这可能会导致意外的维护问题。

go

-3
推荐指数
1
解决办法
96
查看次数

声明一个没有数据类型的变量

我有一段代码需要一个没有其类型的变量声明。稍后会为该变量分配一个值,这就是一个接口。伪代码看起来与此非常相似:

var client
if some_condn {
   client = ssh.Dial(params)
} else {
   client = my_own_ssh_dial(my_params)
}
session,_ := client.NewSession()
Run Code Online (Sandbox Code Playgroud)

问题是 GO 不允许无类型的变量声明。有什么方法可以使用像通用对象(来自Java)之类的东西来默认客户端?

TIA

variables go

-3
推荐指数
1
解决办法
59
查看次数

如何干净地向函数添加参数

我有一个被多次调用的函数。我现在如何向该函数添加一个额外的参数,而不必修改所有调用站点(本质上是侵入那里的默认值并添加一堆噪音)以及保持类型安全?

我以前使用过的所有语言都支持默认参数或重载,所以我很不知道我将如何做到这一点。

go

-3
推荐指数
1
解决办法
104
查看次数

如何将布尔值从 true 更改为 false,反之亦然

我在 Go 中需要改变 bool 值并存储它。我收到 value == true 但我需要更改它并存储更改后的值。我可以想到只将警报存储到 var 并在下一个语句中传递它。

例如伪代码:

chnagevalue := false

if value == false {
     changevalue == true 
}
Run Code Online (Sandbox Code Playgroud)

在 Go 中最好的方法是什么?有没有预先定义的方法来做到这一点?

boolean-logic boolean go

-3
推荐指数
1
解决办法
1013
查看次数

标签 统计

go ×10

interface ×2

boolean ×1

boolean-logic ×1

error-handling ×1

gzip ×1

java ×1

json ×1

null ×1

request ×1

slice ×1

variables ×1