だいせんじがけだらなよさ

12 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是無能。
最近我開始思考,如果最終要接觸Go,是不是最好先學習C語言?因此,我從過去的挫折中學習,回顧了Go和Rust中那些不需要過多考慮的記憶體處理方式。突然,我在瀏覽SCP的並行處理版本mscp的原始碼時,好奇為什麼它會返回-1作為返回值。

$ grep -r 'return \-1' ./* | sort | uniq
grep: warning: stray \ before -
./libssh/doc/guided_tour.dox:                return -1;
./libssh/doc/guided_tour.dox:            return -1;
./libssh/doc/guided_tour.dox:        return -1;
./libssh/examples/keygen.c:     return -1;
./libssh/examples/knownhosts.c:                return -1;
./libssh/examples/knownhosts.c:            return -1;
./libssh/examples/knownhosts.c:        return -1;
./libssh/examples/libssh_scp.c:                    return -1;
./libssh/examples/libssh_scp.c:                return -1;
./libssh/examples/libssh_scp.c:            return -1;
./libssh/examples/libssh_scp.c:        return -1;
./libssh/examples/libssh_scp.c:    return -1;
./libssh/examples/samplesftp.c:            return -1;
./libssh/examples/samplesftp.c:        return -1;
./libssh/examples/scp_download.c:                         return -1;
./libssh/examples/scp_download.c:                 return -1;
./libssh/examples/scp_download.c:         return -1;
./libssh/examples/scp_download.c:        return -1;
./libssh/examples/ssh_X11_client.c:                     return -1;
./libssh/examples/ssh_X11_client.c:             return -1;
./libssh/examples/ssh_X11_client.c:     return -1;
./libssh/examples/ssh_client.c:            return -1;
./libssh/examples/ssh_client.c:        return -1;
./libssh/examples/ssh_server.c:        return -1;
./libssh/examples/sshd_direct-tcpip.c:        return -1;
./libssh/examples/sshnetcat.c:          return -1;
./libssh/examples/sshnetcat.c:      return -1;
./libssh/examples/sshnetcat.c:    return -1;
./libssh/src/agent.c:      return -1;
./libssh/src/agent.c:    return -1;
./libssh/src/agent.c:  return -1;
./libssh/src/auth.c:            return -1;
./libssh/src/auth.c:        return -1;
./libssh/src/base64.c:                             if(!ptr) return -1; \

回想起來,我好像從未見過執行結果的返回值是兩位數的。
我在Yahoo!知識+上找到了大約2008年的回答,解釋了使用-1的原因,但那並不是一個很正經的回答,我只找到了日立發布的應用伺服器和中介軟體產品uCosminexus Interschema中提到這一點。
C語言的出口函數定義

3 -1 轉換失敗 傳遞給使用者內建函數的字串的字元編碼 這是傳遞給使用者內建函數的字串附加終止NULL的結果。

然後,如果在最後給予return -1並檢查返回值,會得到255

alleycat:[haturatu]:~/git/cmem$ ./a
格納した文字列 : Hi, My sweet hearts
alleycat:[haturatu]:~/git/cmem$ echo $?
255

Go語言的情況

這在Go語言中,即使給予os.Exit(-1)也是一樣的,但有時會變成254,讓我感到困惑。 我想知道,除了0、1、2之外,是否所有其他情況都返回-1,並將-1作為動態錯誤碼返回,以將其視為不會影響其他操作的異常錯誤?
這類資訊相當少,如果說Go語言中領先開發的技術,我想應該是Go-Ethereum,但仔細一看,它也...

:~/git/go-ethereum$ grep -r "return \-1"
grep: warning: stray \ before -
crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/Secp256k1Context.java:     if(!enabled) return -1; //sanity check
crypto/secp256k1/libsecp256k1/src/num_gmp_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/field_10x26_impl.h:            return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:            return -1;
crypto/secp256k1/libsecp256k1/src/field_5x52_impl.h:            return -1;
crypto/secp256k1/libsecp256k1/src/gen_context.c:        return -1;
crypto/signify/signify_fuzz.go:         return -1
trie/iterator.go:               return -1
trie/iterator.go:               return -1
event/event.go: return -1
event/feed.go:  return -1
common/prque/lazyqueue.go:      return -1
triedb/pathdb/database_test.go: return -1
cmd/devp2p/nodesetcmd.go:                               return -1, errors.New("-limit requires an argument")
cmd/devp2p/nodesetcmd.go:                               return -1, fmt.Errorf("invalid -limit %q", args[i+1])
cmd/devp2p/nodeset.go:                  return -1
cmd/devp2p/dns_route53.go:                      return -1
accounts/abi/bind/bind.go:                              return -1
core/state/snapshot/iterator_fast.go:           return -1
core/state/snapshot/iterator_fast.go:           return -1
p2p/protocol.go:                        return -1
p2p/enode/node.go:                      return -1

仔細一看,大部分都是在函式庫中呼叫的,在龐大的程式碼中只有上述這些。我感覺這可能是從某處拿來的公開金鑰加密實作原始碼,所以實際上可能不是Go-Ethereum的程式碼。

另一個從很久以前就開始開發的是Hugo。

:~/git/hugo$ grep -r "return \-1"
grep: warning: stray \ before -
compare/compare_strings.go:             return -1
htesting/test_helpers.go:                       return -1
htesting/test_helpers.go:       return -1
hugolib/filesystems/basefs_test.go:             return -1, nil, err
common/hreflect/helpers.go:             return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator.go:        return -1
common/herrors/error_locator.go:        return -1
common/herrors/error_locator.go:                return -1
common/herrors/file_error.go:                   return -1
common/herrors/file_error.go:           return -1, ""
common/herrors/file_error.go:   return -1, -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:         return -1
common/hugo/version.go: return -1
common/paths/pathparser.go:             return -1
identity/finder.go:     return -1
resources/page/permalinks.go:                                   return -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort_search.go:    return -1
resources/page/pages_sort_search.go:            return -1
resources/page/pagination.go:           return -1, errors.New("too many arguments, 'pager size' is currently the only option")
resources/page/pagination.go:           return -1, errors.New(("'pager size' must be a positive integer"))
resources/images/image.go:              return -1
tpl/collections/where.go:       return -1, errors.New("unable to convert value to float")
tpl/collections/where.go:       return -1, errors.New("unable to convert value to int")
tpl/transform/transform.go:             return -1
tpl/internal/go_templates/htmltemplate/transition.go:   return -1
tpl/internal/go_templates/htmltemplate/transition.go:                   return -1, errorf(ErrBadHTML, nil, 0, "%q in attribute name: %.32q", s[j:j+1], s)
tpl/internal/go_templates/fmtsort/sort.go:              return -1 // No good answer possible, but don't return 0: they're not equal.
tpl/internal/go_templates/fmtsort/sort.go:                      return -1
tpl/internal/go_templates/fmtsort/sort.go:              return -1, true
tpl/tplimpl/template.go:                                return -1
tpl/tplimpl/template.go:                        return -1
tpl/tplimpl/shortcodes.go:      return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go:                                 return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go: return -1

來看看用C語言編寫的bash的情況

而且,bash會返回除了0、1等之外的返回值,所以我們來看看bash的原始碼。

alleycat:[haturatu]:~/git/bash$ echo $?
130
alleycat:[haturatu]:~/git/bash$ a
bash: a: 命令が見つかりません
alleycat:[haturatu]:~/git/bash$ echo $?
127

這樣的話,似乎會有return 130之類的。

alleycat:[haturatu]:~/git/bash$ grep -r "return [0-9]" | awk '{print $2" " $3}' | sort | uniq | grep ^r
grep: .git/objects/pack/pack-715759b749131276aa4809bba44f79c13feb23ec.pack: binary file matches
return 0
return 0,
return 0.
return 0.0;
return 0;
return 0L;
return 1
return 1,
return 1-no_line_editing;
return 1.
return 10;
return 11;
return 12;
return 13;
return 14;
return 16
return 1;
return 2
return 2;
return 2;;
return 3
return 3;
return 4
return 42
return 4;
return 5
return 5;
return 6;
return 7
return 7;
return 8;
return 99999;
return 9;
alleycat:[haturatu]:~/git/bash$ grep -r "return -[0-9]" | awk '{print $2" " $3}' | sort | uniq | grep ^r
return -1
return -1.
return -1/EINVAL
return -1;
return -25
return -2;

沒有找到。嚴格來說,grep -r "return " | grep -oP "return.*" | sort | uniq | grep "[0-9]" 可能會提取更多,但因為太長了,請允許我使用上述方法。
這樣一來,就只能認為它是在動態生成錯誤碼了。

我調查這些無聊的事情,是因為我預計除錯會變得非常困難,所以想提前做些研究,而且即使Go是一個變得更簡單的語言,似乎也無法擺脫C語言

だいせんじがけだらなよさ

久違地聽加藤和彥的專輯時,對曲名だいせんじがけだらなよさ感到好奇,一查發現是卡門·真木的翻唱。
而原作者似乎是寺山修司。
《如果只有告別是人生》與《だいせんじがけだらなよさ》 詩:寺山修司 歌:卡門·真木 1969年

如果只有告別是人生 那即將到來的春天是什麼呢
在遙遠遙遠的地之盡頭綻放的野百合是什麼呢
如果只有告別是人生 那重逢之日是什麼呢
溫柔溫柔的夕陽與 兩人的愛是什麼呢
如果只有告別是人生 那建造的家是什麼呢
在寂寞寂寞的平原上 點燃的燈火是什麼呢
如果只有告別是人生 那人生什麼的 我不需要。
寺山修司 《如果只有告別是人生》

感到寂寞時說出口 孤單一人的咒語
為了忘記離別之人的回憶的咒語
だいせんじがけだらなよさ だいせんじがけだらなよさ
倒過來讀就成了那個人 教給我的歌
只有告別是人生
只有告別是人生
寺山修司 《だいせんじがけだらなよさ》

這種微不足道的感覺更添了一絲哀愁呢。
加藤和彥原來的The Folk Crusaders或許正是因為有這些日本文學作品才得以存在吧。

Related Posts