我有以下地图:
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对象的指针还是实际上存储了值?
我会尽力解决我的问题。
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
那么...为什么我的压缩缓冲区比原始的非压缩字符串大?
编辑:当某人试图了解为什么正在发生某事时,投下一个问题的巨魔很搞笑。猜猜我应该盲目接受它,而不要问。
我正在学习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) 知道为什么我无法关闭请求正文吗?请求返回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) 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给一个值变量。
这是如何运作的?
我知道我可以用字符串填充 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)
哪个有效,但是mongo的InsertMany函数需要一个[]interface{}参数:
cannot use users (type []Users) as type []interface {} in argument to database.InsertMany
Run Code Online (Sandbox Code Playgroud)
我如何定义和填充一个[]interface{}?
我在 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 变成一个接口,然后让我的所有具体对象自己定义属性/变量。那里有很多重复的代码,这可能会导致意外的维护问题。
我有一段代码需要一个没有其类型的变量声明。稍后会为该变量分配一个值,这就是一个接口。伪代码看起来与此非常相似:
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
我有一个被多次调用的函数。我现在如何向该函数添加一个额外的参数,而不必修改所有调用站点(本质上是侵入那里的默认值并添加一堆噪音)以及保持类型安全?
我以前使用过的所有语言都支持默认参数或重载,所以我很不知道我将如何做到这一点。
我在 Go 中需要改变 bool 值并存储它。我收到 value == true 但我需要更改它并存储更改后的值。我可以想到只将警报存储到 var 并在下一个语句中传递它。
例如伪代码:
chnagevalue := false
if value == false {
changevalue == true
}
Run Code Online (Sandbox Code Playgroud)
在 Go 中最好的方法是什么?有没有预先定义的方法来做到这一点?