go 包的命名约定是有据可查的,golang.org 的博客指出:
好的包名简短而清晰。它们是小写的,没有下划线或混合大写。它们通常是简单的名词,例如 [descriptions removed]: time, list, http
同一个指南然后提供了两个坏名字的例子:
以下是两个在其他语言中可能风格不错但在 Go 中不太适合的名称示例:computeServiceClient、priority_queue
指南没有说的是,当您有一个具有非常特定用途的包裹而实际上不适合作为一个词的名词时该怎么做。
我们有一个名为 Rhino Horn 的库,用于在内部查找意外泄露的凭据。出于运行 Rhino Horn 的资源密集程度的原因,我被指示在 golang 中为 Rhino Horn 编写一个主管,以监控其性能并在需要时快速关闭。Rhino Horn 不是用 Go 编写的,而是一个完全独立的项目。
golang 命名约定会让我给 Rhino Horn Supervisor 起什么名字?
我注意到很多命令行工具,例如wget,会将进度显示为一个数字或进度条,它在进程完成时前进.虽然问题不是特定于语言,但我最常用于命令行工具(C++,Node.js,Haskell)的语言中,我还没有看到过这样做的方法.
除了其他信息外,wget还会显示一个进度条(<=>),它会在下载文件时前进.到目前为止下载的数据量(6363,179561,316053)和当前下载速度(10.7KB/s,65.8KB/s,63.0KB/s)也会更新.这是怎么做到的?
理想情况下,请包含上述三种语言中的一种或多种语言的代码示例.
我正在forkIO
使用以下代码来处理Haskell轻量级线程():
import Control.Concurrent
beginTest :: IO ()
beginTest = go
where
go = do
putStrLn "Very interesting string"
go
return ()
main = do
threadID1 <- forkIO $ beginTest
threadID2 <- forkIO $ beginTest
threadID3 <- forkIO $ beginTest
threadID4 <- forkIO $ beginTest
threadID5 <- forkIO $ beginTest
let tID1 = show threadID1
let tID2 = show threadID2
let tID3 = show threadID3
let tID4 = show threadID4
let tID5 = show threadID5
putStrLn "Main Thread"
putStrLn …
Run Code Online (Sandbox Code Playgroud) Haskell缓存纯函数调用的结果,这是纯粹和不纯行为分离的众多原因之一.但是这个函数应该在O(n)中运行,其中n在50
下面,运行得非常慢:
lucas 1 = 1
lucas 2 = 3
lucas n = lucas (n-1) + lucas (n-2)
map (lucas) [1..50]
Run Code Online (Sandbox Code Playgroud)
前三十个左右一起计算在一秒钟内,然后31个需要半秒钟左右,32个需要一秒钟,33个需要几秒钟,34个需要6秒钟,35个需要11秒钟,36个需要17秒钟. .
为什么这个功能这么慢?如果GHC交互式运行时缓存结果,则每次调用lucas
应仅涉及前两个缓存术语的求和.一个额外的操作找到术语3,一个额外的添加找到术语4,一个额外的添加找到术语5,所以术语50达到考虑缓存只有48个加法.该功能不应该花费近一秒钟才能找到至少前几千个术语,为什么表现如此可怕?
我现在已经等了半个多小时lucas 500
才能计算出来.
graphql.org/graphql-js上提供的用于创建简单GraphQL实现的Hello World示例如下:
var { graphql, buildSchema } = require('graphql');
// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
type Query {
hello: String
}
`);
// The root provides a resolver function for each API endpoint
var root = {
hello: () => {
return 'Hello World!';
}
};
// Run the GraphQL query '{ hello }' and print out the response
graphql(schema, '{ hello }', root).then((response) => {
console.log(response);
});
Run Code Online (Sandbox Code Playgroud)
我正在尝试在解析器中运行异步函数,例如数据库调用,我似乎无法弄清楚如何使其工作:
我正在做的事情:
var { graphql, …
Run Code Online (Sandbox Code Playgroud) 出于安全原因,我的Web服务器上有一个文件,我希望能够监视访问.每次访问它时,我都希望将一个条目添加到MySQL日志表中.这样,我就可以从Web应用程序中主动响应安全漏洞.
我正在努力用基于Websocket的数据管道替换基于REST的数据管道,而且我很难找到所有可能出错的地方.系统是生产系统,因此如果失败并且无法恢复,则会发生非常糟糕的事情.这是我到目前为止所得到的:
let server = new Websocket(path, opts)
try-catch
会发现程序员错误,例如错误的URL,但是服务器没有正确响应等操作错误似乎无法捕获,因为它们是异步的并且没有回调server.send(data, cb)
try-catch
它将捕获类型错误,通常是程序员错误function (err) { handleErr(err); }
)是一个很好的操作错误,因为err
如果发送由于任何原因失败,回调将具有非null ,因此处理server.on('error', cb)
error
事件是EventEmitter
规范的一部分,但我还没有抓住它的任何东西ws
自述文件建议将其作为捕获静默连接故障的方法server.on('connection', function(connection) {...})
connection.send('test', function(err) { handleErr(err); });
使用它之前确保连接没有以某种方式进行设置失败是一种很好的方法,但可能没有必要.此外,try-catch
由于上述原因,应将其包装在一起server.on('error', cb)
它似乎ws
很难建立在生产的基础之上是困难的,因为它记录了所有可能出错的不同事物,并且使用像Socket.io这样更加用户友好的库将消除许多性能优势.使用ws
.是否有关于使用时可能出错的所有不同事物的文档ws
,或者至少是对其进行加固的指南?我觉得部署这个东西只是一场赌博,任何一秒钟我都会愤怒地被召入办公室解决问题.
在build
使用Stack project/dist/
编译Haskell程序时,我试图将可执行文件写入其中,但是无论我使用什么命令行参数或更改的配置文件,它始终以结尾project/.stack-work/dist/x86_64-osx/Cabal-2.2.0.1/build/project/
。
花时间寻找在命令行参数体面的数额后stack
命令,以及期权project.cabal
,Setup.hs
以及stack.yaml
,我似乎无法找到如何配置的输出位置stack build
。
如何配置可执行文件的输出位置stack build
?
在新的类型参数设计草案中,您现在可以将接口约束应用于泛型函数:
func prettyPrint[T Stringer](s T) string {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,通过使用没有泛型的接口参数,这已经成为可能:
func prettyPrint(s Stringer) string {
...
}
Run Code Online (Sandbox Code Playgroud)
使用第一个和使用第二个有什么区别?
在 Rust 中,thread::JoinHandle<T>
标准库中包含的类型具有类型参数T
。然而,似乎并没有T
实际设置或用于任何用途。
事实上,Rust 自己的文档大多只是thread::JoinHandle<_>
在需要将 a 分配JoinHandle<T>
给某些东西时使用。这T
实际上有什么作用?
我正在尝试编写一个函数,如果元组中的任何两个值相同,它将Nothing
成为Just
Int
元组.对于五个值的元组,这就是我所拥有的.显然,还有改进的余地:
nothingIfMatch :: Maybe (Int, Int, Int, Int, Int) -> Maybe (Int, Int, Int, Int, Int)
nothingIfMatch Nothing = Nothing
nothingIfMatch (Just (a, b, c, d, e))
| a == b = Nothing
| a == c = Nothing
| a == d = Nothing
| a == e = Nothing
| b == c = Nothing
| b == d = Nothing
| b == e = Nothing
| c == d = Nothing …
Run Code Online (Sandbox Code Playgroud) 我在 Go 中有一个坐标对 ( ) 的 FIFO 队列[x, y]
:
type Copair [2]int
type Queue []Copair
var q = Queue{ ... preloaded values ... }
Run Code Online (Sandbox Code Playgroud)
API 定义如下,其中重要的部分是函数pop()
:
func (q Queue) push(p Copair) {
q = append(q, p)
}
func (q Queue) pop() (error, Copair) {
if q != nil && len(q) >= 1 {
q = q[1:]
return nil, q[0]
} else {
return errors.New("index out of range [0]"), nil
}
}
Run Code Online (Sandbox Code Playgroud)
因为q = q[1:]
我正在重新构造切片,理论上它只需要在内存中更改一个地址,因此是一项恒定时间操作。现在理所当然,我们正在逐渐丢失堆上的字节(或者谁知道,Go …
我有一系列按钮(其中25个)用于设置Web应用程序中某些内容的高度.我知道这是一种奇怪的方式,但这是有原因的.每个按钮的id等于它设置的高度,以英寸为单位,从0到24,它们都共享HeightButtons类.这是我到目前为止所做的,手动输入全部:
$('#0').click()(function() {
LiftHeight = 0;
}$('#1').click()(function() {
LiftHeight = 1;
}$('#2').click()(function() {
LiftHeight = 2;
}$('#3').click()(function() {
LiftHeight = 3;
}$('#4').click()(function() {
LiftHeight = 4;
}$('#5').click()(function() {
LiftHeight = 5;
}$('#6').click()(function() {
LiftHeight = 6;
}$('#7').click()(function() {
LiftHeight = 7;
}$('#8').click()(function() {
LiftHeight = 8;
}$('#9').click()(function() {
LiftHeight = 9;
}$('#10').click()(function() {
LiftHeight = 10;
}$('#11').click()(function() {
LiftHeight = 11;
}$('#12').click()(function() {
LiftHeight = 12;
}$('#13').click()(function() {
LiftHeight = 13;
}$('#14').click()(function() {
LiftHeight = 14;
}$('#15').click()(function() { …
Run Code Online (Sandbox Code Playgroud) haskell ×5
go ×3
node.js ×3
algorithm ×2
javascript ×2
asynchronous ×1
big-o ×1
build ×1
c++ ×1
caching ×1
command-line ×1
compilation ×1
concurrency ×1
database ×1
file ×1
generics ×1
graphql ×1
graphql-js ×1
interface ×1
io ×1
jquery ×1
logging ×1
loops ×1
memory ×1
monitor ×1
optimization ×1
php ×1
rust ×1
slice ×1
stdout ×1
syntax ×1
terminal ×1
websocket ×1