Questions tagged «go»

Go,也称为golang,是最初由Google开发的一种开源编程语言。它是一种静态类型的语言,其语法是从C语言中松散地派生的,从而增加了自动内存管理,类型安全性,一些动态键入功能,其他内置类型(例如可变长度数组和键值映射)以及大型标准库。


1
Rust特性与Go Interface有何不同?
我对Go相对熟悉,在其中编写了许多小程序。当然,Rust我不太熟悉,但请注意。 最近阅读过http://yager.io/programming/go.html以后,我认为我将亲自研究泛型的两种处理方式,因为在实践中,当接口实际上没有太多内容时,这篇文章似乎不公平地批评了Go。不能优雅地完成。我一直在听到关于Rust的特质多么强大的炒作,除了人们对Go的批评之外,什么也没有。有了Go的经验,我想知道它的真实性以及最终的差异。我发现特征和接口非常相似!最终,我不确定是否遗漏了一些东西,因此这里是他们相似之处的快速教育总结,您可以告诉我我错过了什么! 现在,让我们从他们的文档中了解Go Interfaces : Go中的接口提供了一种指定对象行为的方式:如果可以做到这一点,则可以在这里使用它。 到目前为止,最常见的接口是Stringer返回表示对象的字符串。 type Stringer interface { String() string } 因此,String()在其上定义的任何对象都是Stringer对象。可以在类型签名中使用它,这样func (s Stringer) print()几乎可以获取所有对象并进行打印。 我们也有interface{}哪个对象。然后,我们必须在运行时通过反射确定类型。 现在,让我们从他们的文档中了解Rust特性: 简单来说,特征是一组零个或多个方法签名。例如,对于可以打印到控制台的内容,我们可以使用单个方法签名声明特征Printable: trait Printable { fn print(&self); } 这立即看起来与我们的Go Interfaces非常相似。我看到的唯一区别是,我们定义了特征的“实现”,而不仅仅是定义了方法。所以,我们做 impl Printable for int { fn print(&self) { println!("{}", *self) } } 代替 fn print(a: int) { ... } 额外的问题:如果定义一个实现特征但不使用的函数,在Rust中会发生什么impl?就是行不通吗? 与Go的接口不同,Rust的类型系统具有类型参数,可让您执行适当的泛型和诸如interface{}编译器和运行时实际知道类型的操作。例如, …
64 go  rust 


1
为什么Go中有“新功能”?
我仍然对为什么要new加入Go 感到困惑。 当您要实例化结构时,您可以 t := Thing{} 您可以通过执行以下操作获取指向新实例的指针 t := &Thing{} 但是也有这种可能性: t := new(Thing) 最后一个似乎与其他语言有些异。&Thing{}就像new(Thing)它一样简洁明了,它仅使用您经常在其他地方使用的结构。当您将其更改为&Thing{3}或时, 它也可以扩展&Thing{Feets:7}。 在我看来,使用补充关键字1代价很高,它使语言更加复杂,并增加了您必须了解的内容。它可能对新手来说掩盖了实例化一个结构的背后。 它还使另一个保留字。 那么背后的原因是new什么?有时有用吗?我们应该使用它吗? 1:是的,我知道它不是语法级别的关键字,您可以对其进行阴影处理,但这并不会改变它对于合理的开发人员来说是保留字的事实。
49 go 

1
go-langs goroutine池只是绿色线程吗?
在这里评论员提供绿色线程的批评如下: 最初,我是在N:M模型上出售的,这是一种使事件驱动的程序不带回调地狱的方法。您可以编写看起来像是古老的过程代码的代码,但是在其中有一种神奇之处是,只要有东西阻塞,它就会使用用户空间任务切换。听起来不错。问题在于,我们最终要用更多的复杂性来解决复杂性。swapcontext()和family相当困难,其复杂性来自其他意外地方。 突然之间,您被迫编写了一个用户空间调度程序,并猜测编写一个调度程序确实很难做,而要使Linux的调度程序投入大量的精力,这将做得更好。现在,您希望您的日程表将N个绿色线程分配给M个物理线程,因此您不必担心同步。同步带来了性能问题,因此现在就开始您的工作吧,您将遇到一个新的无锁兔子洞。构建正确的高度并发调度程序绝非易事。 另一个批评是在这里: 伪造多个线程的单个进程存在很多问题。其中之一是,所有伪造的线程都会在任何页面错误时停止运行。 我的问题是- 是去浪的够程(用于默认池)只是绿色的线?如果是这样,他们是否解决了上述批评?

4
可以走多快?
Go是少数应该“接近金属”运行的语言之一,也就是说,它是经过编译,静态类型化的,并且无需VM即可在本地执行代码。这应该使其相对于Java,C#等具有速度优势。但是,它似乎落后于Java(请参阅《编程语言实战》) 我假设不太成熟的编译器对此负有很大责任,但是还有其他原因吗?Go的设计中是否有固有的功能可以阻止它比Java更快地运行?我对运行时模型有一个非常简单的看法,但是由于本地代码的执行,看来至少在原则上它应该比Java运行得更快。

4
Google在Go语言上投入了多少?
我已经阅读了很多有关Go语言的内容,而且看起来很有希望。在决定对语言进行更多努力之前,我缺少的最后重要信息是:Google或其他公司在开发工作上投入了多少金钱/人力?如果无法提供此信息,您是否还有其他信息可表明Google对项目的承诺。它是否被用作新投资或类似投资的主要语言(我想这还为时过早,但我不知道)?

3
在GOPATH之外拥有Go项目的源代码是一个坏主意
我正在使用Go进行一个新项目,而我们都是Go的新手。我们遵循标准的go目录结构,并将所有代码置于 $ GOPATH / src / github.com / companyname / projectname 这也是git仓库的根 推荐的标准路径布局确实有些奇怪,特别是如果我们正在开发多语言项目,例如基于Go的rest / http后端和html / javascript前端。在这种情况下,我可能希望我的项目结构如下所示: / doc/ src/ server/ main.go module1/ module.go client/ index.html Makefile 但是实际上是否需要将代码放置在GOPATH中? 作为尝试,我创建了一个小程序,其中的源代码在GOPATH之外。我可以轻松地将项目拆分为多个包,因此该main包可以使用引用文件夹中的一个foo包。foo/import "./foo" 据我所知,有两件事使我无法接受: 其他代码无法导入此代码。这不是问题,因为我们正在为公司专门构建服务。 我不能go install用来安装它。这也不是问题。构建管道将安装该工具。 但是,它确实允许构建服务器的工作区不位于GOPATH内 不鼓励这种方法吗?如果是这样,为什么呢? 除了我列出的两个副作用之外,还有其他副作用吗? 请记住,这是公司的私人项目,而不是公开的开源代码。 将实际项目从GOPATH中分离出来似乎很诱人,但是当您处于Shu阶段时,应该小心打破规则
32 go 

8
什么时候需要“成千上万”的线程?
Erlang,Go和Rust都以一种或另一种方式声称它们支持使用廉价的“线程” /协程进行并发编程。在转到FAQ状态: 在同一个地址空间中创建数十万个goroutine是很实际的。 该防锈教程说: 由于创建任务比传统线程便宜得多,因此Rust可以在典型的32位系统上创建数十万个并发任务。 Erlang的文档说: 为了支持具有数十万甚至数百万个进程的Erlang系统,默认的初始堆大小为233个字是非常保守的。 我的问题:哪种应用程序需要这么多并发执行线程?只有最繁忙的Web服务器才能同时接收数千名访问者。当线程/进程的数量远大于物理核心的数量时,我编写的老板/工作调度型应用程序命中率递减。我想这对于数字应用程序可能有意义,但实际上,大多数人将并行性委托给以Fortran / C / C ++编写的第三方库,而不是这些较新一代的语言。

1
Hindley-Milner推理可以为Go语言工作吗?
我读过Hindley-Milner不适用于具有子类的类型系统,并且还有其他类型系统功能也不能很好地使用它。Go当前在:=运算符中只有非常有限的类型推断。但是Go并没有传统意义上的子类,只有看起来与Haskell的类型类非常相似的接口,可以很好地与Hindley-Milner推理配合使用。 那么,Hindley-Milner推理在原理上是否可以像对Haskell一样进行推论?还是Go具有其他打破它的功能?(另一方面,Haskell还具有某些与Hindly-Milner不兼容的功能,如果要使用这些功能,则必须手动键入程序的那些部分。)

1
Go如何通过“隐式”界面提高生产率,与C#的扩展方法概念相比又如何?
在Go语言教程中,他们解释了界面如何工作: Go没有课程。但是,您可以在结构类型上定义方法。该方法接收器出现在FUNC关键字和方法名之间自身的参数列表。 type Vertex struct { X, Y float64 } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } 接口类型由一组方法定义。接口类型的值可以包含实现那些方法的任何值。 这是在Go中创建界面的唯一方法。Google进一步说明: 类型通过实现方法来实现接口。没有明确的意图interface声明(即声明)。 隐式接口将实现程序包与定义接口的程序包分离:两者都不依赖彼此。 它还鼓励定义精确的接口,因为您不必查找每个实现并使用新的接口名称对其进行标记。 所有这些听起来都像C#中的扩展方法,但是Go中的方法是残酷的多态的。它们将在实现它们的任何类型上运行。 Google声称这鼓励快速发展,但是为什么呢?您是否放弃了C#中的显式接口而放弃了某些东西?C#中的扩展方法能否允许人们从Go接口中获得C#的某些好处?
21 c#  language-design  go 


3
从左到右语言语法的优点
我一直在Channel9上观看Herb Sutter的一次采访,他在视频的结尾提到,对于将来的C ++标准,从左到右的语言语法将是他的愿望清单上的第一名(尽管他承认以这种方式修改C ++会造出完全不同的野兽)。 除了: 人类更容易理解,肉眼更清晰;例如 //C syntax /*pointer to function taking a pointer to function(which takes 2 integers as arguments and returns an int), and an int as arguments and returning an int*/ int (*fp)(int (*ff)(int x, int y), int b) //Go analogous syntax which is left to write …

5
公共图书馆是个好主意吗?
我一直认为“公共库”是个好主意。我的意思是说,该库包含一些不同应用程序经常需要的通用功能。这样可以减少代码重复/冗余。 我最近读了一篇文章(现在找不到),说这实际上是个坏主意,甚至说这是“反模式” 虽然这种方法有好处。版本控制和变更管理意味着对使用此库的一组应用程序进行回归测试。 对于我的新(Golang)项目,我有些陷入困境。多年来,重复数据删除技术已深深扎根于我,但我觉得这次应该尝试一下。 在撰写本文时,我开始认为这种“通用库”方法是对体系结构进行浏览的结果?也许我的设计需要更多思考? 有兴趣听到想法。
16 design  go 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.