История изменений
Исправление r, (текущая версия) :
Ну, это ерунда.
А по моему совсем не ерунда если нельзя контролировать скоуп различных закрываемых ресурсов типа файлов/соединений/запросов в бд. Особенно это критично в бд будет когда insert/update после select будет конкурировать с этим же select чуть ранее не отпуская его до завершения функции.
Да и вообще - посмотри код работы с бд из их же примеров:
age := 27
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
log.Fatal(err)
}
fmt.Printf("%s is %d\n", name, age)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
Даже на эрланге аналог будет приблизительно таким:
Age = 27,
do([error_m ||
Rows <- db:query(db, "SELECT name FROM users WHERE age=?", Age),
db:foreach(fun({Name}) -> io:format("~s is ~d\n", [Name, Age]) end, Rows)
])
без всего этого бойлерплейта.
Особенно мне нравится что я тут совсем не вижу почему оно прерывает execution. Черная магия log.Fatal?
Исправление r, :
Ну, это ерунда.
А по моему совсем не ерунда если нельзя контролировать скоуп различных закрываемых ресурсов типа файлов/соединений/запросов в бд. Особенно это критично в бд будет когда insert/update после select будет конкурировать с этим же select чуть ранее не отпуская его до завершения функции.
Да и вообще - посмотри код работы с бд из их же примеров:
age := 27
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
log.Fatal(err)
}
fmt.Printf("%s is %d\n", name, age)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
Даже на эрланге аналог будет приблизительно таким:
Age = 27,
do([error_m ||
Rows <- db:query(db, "SELECT name FROM users WHERE age=?", Age),
db:foreach(fun({Name}) -> io:format("~s is ~d\n", [Name, Age]) end, Rows)
])
без всего этого бойлерплейта.
Исправление r, :
Ну, это ерунда.
А по моему совсем не ерунда если нельзя контролировать скоуп различных закрываемых ресурсов типа файлов/соединений/запросов в бд. Особенно это критично в бд будет когда insert/update после select будет конкурировать с этим же select чуть ранее не отпуская его до завершения функции.
Да и вообще - посмотри код работы с бд из их же примеров:
age := 27
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
log.Fatal(err)
}
fmt.Printf("%s is %d\n", name, age)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
Даже на эрланге аналог будет приблизительно таким:
Age = 27,
do([error_m ||
Rows <- db:query(db, "SELECT name FROM users WHERE age=?", Age),
db:foreach(fun({Name}) -> io:format("%s is %d\n", [Name, Age]) end, Rows)
])
без всего этого бойлерплейта.
Исходная версия r, :
Ну, это ерунда.
А по моему совсем не ерунда если нельзя контролировать скоуп различных закрываемых ресурсов типа файлов/соединений/запросов в бд. Особенно это критично в бд будет когда insert/update после select будет конкурировать с этим же select чуть ранее не отпуская его до завершения функции.
Да и вообще - посмотри код работы с бд из их же примеров:
age := 27
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
log.Fatal(err)
}
fmt.Printf("%s is %d\n", name, age)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
Даже на эрланге аналог будет приблизительно таким:
Age = 27,
do([error_m ||
Rows <- db:query(db, "SELECT name FROM users WHERE age=?", Age),
db:foreach(fun({Name}) -> io:format("%s is %d\n", [Name, Age]) end)
])
без всего этого бойлерплейта.