我正在尝试awk在我的go程序中执行命令(awk命令从加利福尼亚邮政编码的制表符分隔文件中拉取指定城市的邮政编码,在本例中为旧金山):
cmd := exec.Command(
"awk",
"-F",
"'\\t'",
"'{if ($4 == \"SAN FRANCISCO\") print $0; }'",
"zipcodes_ca.txt",
)
fmt.Println(cmd.Args)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return
}
Run Code Online (Sandbox Code Playgroud)
这输出:
[awk -F '\t' '{if ($4 == "SAN FRANCISCO") print $0; }' zipcodes_ca.txt]
exit status 2: awk: syntax error at source line 1
context is
>>> ' <<<
awk: bailing out at …Run Code Online (Sandbox Code Playgroud) 在create/insert上添加计算值的最佳实践方法是什么?我应该为创建和更新创建唯一的变更集吗?
比方说,我有一个博客文章模型,我想创建一个标题slug值并存储它.这有点做作,但出于某种原因说我只想在创建而不是更新时设置它.我应该做以下事情吗?
defmodule MyBlog.Post do
use MyBlog.Web, :model
schema "posts" do
field :title, :string
field :title_slug, :string
field :content, :text
timestamps
end
@required_fields ~w(
title
content
)
@optional_fields ~w()
def create_changeset(model, params \\ :empty) do
changeset(model, params)
|> generate_title_slug
end
defp changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
defp generate_title_slug(changeset) do
put_change(changeset, :title_slug, __some_slug_generation_code__)
end
def update_changeset(model, params \\ :empty) do
changeset(model, params)
end
end
Run Code Online (Sandbox Code Playgroud) 从Firebase获取数据的惯例似乎是创建一个在内部使用AngularFire的服务类.然后,在您的应用程序的组件中,您可以注入并使用该服务.这使您可以在单元测试组件时轻松模拟服务.
但是,我仍然不清楚如何测试实际的服务本身.
举个例子,假设我todo list在Firebase中有一个节点,我有一个简单的服务来抓取所有的节点todos,如下所示:
import { Injectable } from '@angular/core';
import { AngularFire } from 'angularfire2';
@Injectable()
export class TodoService {
constructor(private af: AngularFire) { }
getAll(): FirebaseListObservable<any[]> {
return this.af.database.list('todos');
}
}
Run Code Online (Sandbox Code Playgroud)
您将如何测试此服务是否符合您的期望?
要验证参数的存在,可以向required_fields模型中的模块属性添加字段.然后将其传递给模型的cast方法,该方法验证该字段是否存在.
但是,如果您只想在插入或更新时验证某些内容的存在,该怎么办?
例如,如果记录没有保留,我只想验证用户的密码是否存在.换句话说,我不希望用户在编辑其帐户信息时必须提供密码.
我提出的最好的方法是为更新和插入提供两组不同的必填字段,然后让方法选择适当的方法:
# in changeset method
cast(params, required_fields(model), @optional_fields)
defp required_fields(model) do
if Map.has_key?(model, :id) do
@update_required_fields
else
@insert_required_fields
end
end
Run Code Online (Sandbox Code Playgroud)
这是合理的,还是有更好的方法?
添加来自@michalmuskala的建议,并添加有关共享变更集功能的后续问题:
def insert_changeset(model, params \\ :empty) do
model
|> cast(params, @insert_required_fields, @insert_optional_fields)
|> shared_changeset
end
def update_changeset(model, params \\ :empty) do
model
|> cast(params, @update_required_fields, @update_optional_fields)
|> shared_changeset
end
defp shared_changeset(changeset) do
changeset
|> validate_password
|> unique_constraint(:email)
end
Run Code Online (Sandbox Code Playgroud) 如果我用它Base.decode16!来解码666F6F它等于"foo".
Base.decode16!("666F6F")
# "foo"
Run Code Online (Sandbox Code Playgroud)
...但如果我解码这个:
Base.decode16!("666F6F01")
# <<102, 111, 111, 1>>
Run Code Online (Sandbox Code Playgroud)
为什么当我添加01到字符串进行解码时输出变为二进制?为什么输出"foo1"不是?
我想将两个值中的较小者分配给一个变量。 在 Ruby 中,我会执行以下操作:
my_var = [value_one, value_two].min
Run Code Online (Sandbox Code Playgroud)
当然,在 Swift中,我可以这样做:
var myVar = 0.0
if valueOne < valueTwo {
myVar = valueOne
} else {
myVar = valueTwo
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有更清洁、更简洁的解决方案。