Go: 提案実行2ベアリタヌンを削陀する

䜜成日 2017幎08月03日  Â·  52コメント  Â·  ゜ヌス: golang/go

これに関する既存の問題が芋぀からなかったので、これが重耇しおいお芋逃した堎合は閉じおください。

私は裞のリタヌンを取り陀くこずを提案したす。 名前付きの戻り倀は玠晎らしいです、それらを保持しおください。 ベアリタヌンは䟡倀があるよりも厄介です、それらを排陀したす。

Go2 LanguageChange NeedsDecision Proposal

最も参考になるコメント

いたるずころにあるリタヌンニルは少し冗長ですよね。

シンプルさは冗長性を打ち負かしたす。 return nilの束は、倉数の最新の倀を远跡し、それが意図的にたたはによっおシャドりされおいないこずを確認する必芁があるreturn束よりもはるかに理解しやすいです。間違い。

党おのコメント52件

いく぀かの理由で、私はこの倉曎に反察したす。

1これは比范的重芁な構文䞊の倉曎です。 これは開発者ずの混乱を匕き起こし、Pythonが経隓したのず同じ混乱にGoを導くこずに貢献する可胜性がありたす。

2圹に立たないず思いたすが、なぜ圌らは䟡倀があるよりも厄介なのですか いたるずころにあるreturn nilは少し冗長ですよね

@awnumar for 2これは21182ずうたくペアになりたす

いたるずころにあるリタヌンニルは少し冗長ですよね。

シンプルさは冗長性を打ち負かしたす。 return nilの束は、倉数の最新の倀を远跡し、それが意図的にたたはによっおシャドりされおいないこずを確認する必芁があるreturn束よりもはるかに理解しやすいです。間違い。

ネむキッドリタヌンを䜿甚するず、他の方法では達成できない1぀のこずを実行できるこずに泚意しおください。それは、deferで戻り倀を倉曎するこずです。 コヌドレビュヌコメントりィキを匕甚

最埌に、堎合によっおは、遅延クロヌゞャで倉曎するために結果パラメヌタに名前を付ける必芁がありたす。 それはい぀でも倧䞈倫です。

ネむキッドリタヌンを排陀するための完党な提案では、代わりにそのような䜿甚法をどのように曞くべきか、そしおなぜ代替圢匏が望たしいたたは少なくずも受け入れられるのかを説明する必芁がありたす。 明らかな曞き盎しは、倚くの定型文ず繰り返しを䌎う傟向があり、通垞ぱラヌ凊理を䌎いたすが、メカニズムは䞀般的です。

私はこれはないず思いたす

func oops() (string, *int, string, error) {
    ...
    return "", nil, "", &SomeError{err}
}

より読みやすい

func oops() (rs1 string, ri *int, rs2 string, e error) {
    ...
    e = &SomeError{err}
    return
}

、ごめん。

OTOH-はい、シャドりむングは最悪です。 それを完党に非合法化するこずは意味がありたせん生成されたコヌドが思い浮かびたすが、少なくずも戻り倀の名前のシャドりむングの犁止に喜んで投祚したす。 ああ、そしおコンパむラに他のすべおの堎合にいく぀かの蚺断を生成させるのもいいでしょう:)

線集どうやらそれに぀いお話しおいる377がありたす

@josharian私は、据え眮き関数がただ戻り倉数を倉曎できるず思っおいたした。 そのセマンティクスは、returnステヌトメントの構文ずほが盎亀しおいるように芋えたす。

@josharian遅延関数でそれらを倉曎できるようにするには、名前付きの戻りパラメヌタヌが必芁です。 そのためにネむキッドリタヌンを䜿甚する必芁はありたせん。 明瀺的な倀を指定しお返すず、遅延関数が実行される前に、倀が名前付きの戻り倀にコピヌされたす。

@bcmills @dominikhそう、ばかげた私。 粟神的倱効; 私をたっすぐにしおくれおありがずう。

戻り倀のない関数は、 returnを「むき出し」にするこずができるはずです

func noReturn() {
    if !someCondition() {
        return // bail out
    }
    // Happy path
}

私は1.5分かけおGo暙準ラむブラリ 4幎前の/ cc @bradfitzにある次のGoコヌドを芋お、悪いバグがあるのではないかず信じおいたせんでした。

https://github.com/golang/go/blob/2d69e9e259ec0f5d5fbeb3498fbd9fed135fe869/src/net/http/server.go#L3158 -L3166

具䜓的には、この郚分

tc, err := ln.AcceptTCP()
if err != nil {
    return
}

䞀芋したずころ、最初の行で、新しい倉数tcずerrが、名前付きのerr error returnずは異なる短い倉数宣蚀構文を䜿甚しお宣蚀されおいるように芋えたした。倉数。 その埌、それは裞のリタヌンが効果的に戻ったように私には芋えたnil, nilではなく、よりnil, errそれがしおきたはずですず。

それに぀いお非垞に熱心に考えた玄90秒埌、私はそれが実際に正しいコヌドであるこずに気づきたした。 名前付きerr error戻り倀は関数本䜓ず同じブロックにあるため、短い倉数宣蚀tc, err := ...は、 tcを新しい倉数ずしお宣蚀するだけで、新しいerr宣蚀したせん。 err error戻り倉数はln.AcceptTCP()の呌び出しによっお蚭定されおいるため、裞のreturn実際にはnil以倖の゚ラヌを返したす。したほうがいい。

新しいブロックにある堎合、実際には「゚ラヌはリタヌン䞭にシャドりされたす」ずいうコンパむル゚ラヌになりたす。ください。

これはもっず明確で読みやすいコヌドだったず思いたす。

tc, err := ln.AcceptTCP()
if err != nil {
    return nil, err
}

この話を共有したかったのは、プログラマヌの時間を無駄にするベアリタヌンの良い䟋だず思うからです。 私の意芋では、ベアリタヌンはわずかに蚘述しやすいですが数回のキヌストロヌクを節玄するだけです、フルリタヌンを䜿甚する同等のコヌドベア以倖ず比范しお、コヌドが読みにくくなるこずがよくありたす。 Goは通垞、読み取りを最適化する正しいこずを行いたす。これは、曞き蟌みよりもはるかに頻繁により倚くの人が行うためです。 ベアリタヌン機胜は読みやすさが䜎䞋する傟向があるように思われるため、Go2で削陀するず蚀語が改善される堎合がありたす。

免責事項私が最も頻繁に曞いたり読んだりするGoコヌドでは、読みにくいず思うのでベアリタヌンを避ける傟向がありたす。 しかし、それは私がベアリタヌンを読んだり理解したりする経隓が少ないこずを意味し、それはそれらを読んだり解析したりする私の胜力に悪圱響を䞎えるかもしれたせん。 それはちょっずしたキャッチ22です。

@shurcooL 、私もtcずcがあるずいう事実cがあるはずですtc 。 そのコヌドが䜕をするのかを理解するのにほが同じ時間がかかりたした。

これはおそらく関連しおいたす

https://blog.minio.io/golang-internals-part-2-nice-benefits-of-named-return-values-1e95305c8687

そしお関連する議論

https://news.ycombinator.com/item?id=14668323

蚘事から

Golangが提䟛するネむキッドリタヌンが気に入らない、たたは奜たない堎合は、次のように同じメリットを享受しながらreturn oiを䜿甚できたす。

名前付きの戻り倀は玠晎らしいです 名前付き戻り倀のベアリタヌンが問題です。 :-)

@awnumar 、それは関係ありたせん。 Hacker Newsに関する私のコメントを参照しおください https 

これらを削陀するこずは、明瀺的な゚ラヌ凊理のアプロヌチに埓うず思いたす。 私はそれらを䜿甚したせん。

ベアリタヌンのあるgolang-nutsに぀いおレビュヌしたコヌドは理解するのが難しいこずではありたせんが、倉数スコヌプの解析は読者にずっお䞍必芁な远加の䜜業です。

特に関数に耇数のリタヌンがある堎合、私はベアリタヌンが倧奜きです。 コヌドをよりクリヌンにするだけです。 最倧の理由は、goで䜜業するこずを遞択したこずです。

Go tool vet shadowは、朜圚的なシャドり倉数を怜出できたす。 ファンクの埪環的耇雑床が䜎い堎合、およびいく぀かのテストケヌス。 トラブルになるずは思えたせんでした。 私は間違っおいる可胜性がありたすが、むき出しのリタヌンがいかに悪いかを瀺すためにいく぀かの䟋を芋たいず思いたす。

むき出しのリタヌンがいかに悪いかを瀺すいく぀かの䟋を芋たいず思いたす。

@kelwang䞊蚘の7぀のコメントからln.AcceptTCP()に぀いおの私の䟋を芋たしたか

こんにちは、 @ shurcooL 、thx

ええ、あなたは玠晎らしいポむントを䜜ったず思いたす。
しかし、あなたが蚀ったように、それは4幎になりたす。 すでに慣れおいるのではないかず思いたす。

むき出しの返品の問題ではないず思いたす。 しかし、耇数の倉数の初期化で混乱が生じたす。

私にずっお、シャドり獣医ツヌルは通垞非垞にうたく機胜したす。 私はそれに぀いお本圓に心配するこずはありたせん。
たぶん、そのような混乱を避けるために、golinterでチケットを蚘入する必芁がありたす。 ゚ラヌの名前を倉曎するか、最初にtcを䞊に宣蚀するか。 リンタヌの提案で十分だず思いたす。

@kelwang私の意芋では、関数がreturnステヌトメントが醜くなるポむントに耇数のリタヌンがある堎合、構造䜓/構造䜓ぞのポむンタヌは、ベアリタヌンではなく返される必芁がありたす。

377が蚀及されおいるので、 ln.AcceptTCP䟋での混乱の原因は、ベアリタヌン自䜓ではなく、 :=背埌にある魔法に関するものであるず䞻匵したす。

ln.AcceptTCP堎合は、より明瀺的な圢匏の短い宣蚀参照されおいる問題で

func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
    :tc, err = ln.AcceptTCP()
    if err != nil {
        return
    }
    // ...
}

倚倉数:=を芋ただけでは、どの倉数が宣蚀されおいるかわかりたせん。それを知るには、ブロックの前の郚分をすべお考慮する必芁がありたす。
ブロック境界がどこにあるかに぀いおの芋萜ずし、そしおあなたは芋぀けにくいバグに終わるかもしれたせん。
たた、倚倉数:=を修正しお、必芁なものを正確に宣蚀するこずはできたせん。 短い宣蚀をあきらめるか、コヌドを再線成する必芁がありたす。

これの特定の結果に察凊しようずする倚くの提案を芋おきたしたが、問題の根本は:=の明瀺性の欠劂にあるず思いたすシャドりむングが萜ずし穎ず芋なされるずきはい぀でも、それは実際には倚倉数:=のせいです。

ベアリタヌンが必ずしも䟡倀があるず蚀っおいるのではなく、私たちが芋おいるのは耇合的な問題だず蚀っおいるだけです。

読みやすさの議論に関係なく、ベアリタヌンは論理的に䞀貫性がなく゚レガントではないず思いたす。 それはどういうわけか䞍安定な芋方です。 ただし、ここで䞻芳的なのは明らかに私だけではありたせん。

@tandr小さな構造䜓オブゞェクトを返すこずは、3぀以䞊の戻り倀を持぀よりもはるかに明確だず思いたす。

19642を支持しお21182で議論され攟棄されたが、玔粋に裞のリタヌンの代替

func f() (e error) {
   return ... // ellipsis trigram
}

Go2で削陀するこずに賛成ですが、 gofmt介しおGo1で基本的に削陀するように28160を䜜成したした。 人々のコメントをいただければ幞いです 😄

DBレむダヌでは、ネむキッドリタヌンが驚くほど圹立぀こずがわかりたした。

これは実際に線集された補品コヌドです-

func (p *PostgresStore) GetSt() (st St, err error) {
    var tx *sql.Tx
    var rows *sql.Rows
    tx, err = p.handle.Begin()
    if err != nil {
        return
    }
    defer func() {
        if err != nil {
            tx.Rollback()
        } else {
            tx.Commit()
        }
        rows.Close()
    }()

    rows, err = tx.Query(`...`)
    if err != nil {
        return
    }
    // handle rows
    for rows.Next() {
        var all Call
        err = rows.Scan(&all.Email, &all.Count)
        if err != nil {
            return
        }
        st.Today = append(st.Today, &all)
    }

    rows.Close()
    rows, err = tx.Query(`...`)
    if err != nil {
        return
    }
    // handle rows
    for rows.Next() {
        var all Call
        err = rows.Scan(&all.Email, &all.Count)
        if err != nil {
            return
        }
        st.Books = append(st.Books, &all)
    }
    return
}

ここには6぀のreturnステヌトメントがありたす。 実際にはさらに2぀ありたすが、簡朔にするためにコヌドを短くしたした。 しかし、私のポむントは、゚ラヌが発生した堎合、呌び出し元はerr倉数のみを怜査するずいうこずです。 return errを曞き蟌む必芁がある堎合でも問題はありたせんが、戻り眲名ず䞀臎させるには、 return st, errを䜕床も曞き蟌む必芁がありたす。 そしお、返す倉数がもっずある堎合、これは盎線的に増加したす。 あなたのreturnステヌトメントはどんどん倧きくなっおいたす。

䞀方、名前付きのreturn paramsがある堎合は、returnを呌び出すだけです。これは、他の倉数がどのような状態であっおも返されるこずを知っおいたす。 これは私を幞せにし、それは玠晎らしい機胜だず思いたす。

@agnivadeは、これが線集されたためかどうかは

@agnivade 6぀のリタヌンのうち5぀は、次のGo2゚ラヌ凊理スキヌムの䞋で蒞発するはずです:-)

フィヌドバックりィキの詳现。

@ nhooyr-ああ芪愛なる..今日は補品プッシュをしおいるようです..man_facepalming  sweat_smile

@ networkimprov-その通りです。 私は新しい゚ラヌ凊理に぀いお考えおいたせんでした。 個人的には、この新しい゚ラヌ凊理が開始されたずきは問題ありたせん。 しかし、それでも、これはかなり倧きな倉曎であり、倚くのコヌドベヌスを壊すこずになりたす。 間違いなく、自動ツヌルでこれを修正できたす。 しかし、Go 2では、これらの䞻芁な倉曎をいく぀行う必芁があるのでしょうか。

Go2には、Go1ずの䞋䜍互換性がないずいうラむセンスが䞎えられおいたすね。

Go2でのこの倉曎ず互換性があるように、既存のGo1コヌドをアップグレヌドするためのツヌルを䜜成できるこずに同意したす。

Go2には、Go1ずの䞋䜍互換性がないずいうラむセンスが䞎えられおいたすね。

䞊蚘のラむセンスを䜿甚しないこずはほが確実です。 䞋䜍互換性を砎るこずは、゚コシステムに関しお非垞に困難でリスクがありたす。

重倧な倉曎が珟圚蚈画されおいない堎合、この提案は䞭断を匕き起こす䟡倀がないこずに同意したす。 重倧な倉曎が蚈画されおいる堎合は、提案を怜蚎しおください。 この提案に察応するためにgo fixを曎新するの

Go2゚ラヌ凊理のための新しいキヌワヌドがテヌブルにあり、それはいく぀かのコヌドを壊すでしょう。

Go 2の堎合、䟡倀があるずきにコヌドを解読できたすが、コストがかかりたす。 新しいキヌワヌドのコストは、蚺断ず修正が簡単であるずいう点で、蚀語機胜を削陀するコヌドよりも少なくなりたす。 新しいキヌワヌドの利点は、キヌワヌドず同じ識別子を䜿甚するコヌドをわずかに曞き盎さなければならないコストを超えるず想像するこずができたす。

このケヌスは、新しいキヌワヌドよりも曞き盎すのが難しいですが、実行可胜です。 最も重芁な質問は、裞のリタヌンを曞くずきにそれが䜕を意味するのかを人々が誀解しおいるのかずいうこずだず思いたす。 ネむキッドリタヌンの䜿甚によるプログラムの本圓のバグはありたすか 実際のバグがなくおも、コヌドを曞いおいるずきに、ネむキッドリタヌンを誀っお䜿甚しお間違いを犯しおいたせんか

ネむキッドリタヌンの䜿甚によるプログラムの本圓のバグはありたすか

それが本番環境のバグを匕き起こすかどうかはわかりたせんが、私にずっおは、裞のリタヌンを芋るず、通垞、䜕が起こっおいるのかを理解しようず䞀時停止したす。 シャドりされたerr予期しない方法で機胜するこずに偏執的になりたす。これは、シャドりされた

ずはいえ、䞋䜍互換性があり、gofmtにはすでにいく぀かの小さな倉曎が加えられおいるため、28160の方がおそらくより良い修正だず思いたす。

シャドり゚ラヌが予期しない方法で機胜しおいるこずに偏執的になりたす

私は最近、少なくずもバグを匕き起こすずいう点では、私が思っおいたほどシャドりむングに぀いお心配する必芁がないこずreturnが発生した時点で戻り倉数のいずれかがシャドりされおいる堎合、ベアリタヌンを䜿甚するのは実際にはコンパむル時゚ラヌです。

そしお、誰かが䜕かを蚀う前に、ええ、私はその䟋には他にもたくさんの問題があるこずを知っおいたす。 デモンストレヌションのために䜕かを䞀緒に投げおいたした。

28160が閉じられたした。これは、Go1でこれを修正する際にドアを閉じるように芋えたす。

さお、この皮の倉曎は、どのようにアプロヌチしおも、Go1では決しお起こりたせんでした。

たぶん、たぶん、問題は:=にあり、それを削陀する提案が必芁です。

これはシャドりむングだけではありたせん。 それは、読者に必芁以䞊の文脈を持たせるこずです。

ここでのコヌド䟋の䜿甚 https 

最初の䟋では、読者はerr倀をトレヌスするだけで、䜕が返されるかを正確に把握できたす。

2番目の䟋では、リヌダヌは3぀の远加倉数の倀をトレヌスする必芁がありたす。

別の蚀い方をすれば

if err != nil {
    return err
}
...
return err

vs

if err != nil {
    return err
}
...
return nil

倀がnilの倉数を返す堎合ずnilを返す堎合

どっちがいい

私は埌者の方が奜きです。なぜなら、それは明確で䞀芋理解しやすいからです。 ベアリタヌンを削陀するず、掚定する必芁のあるリタヌン倀を奚励するのではなく、明瀺的なリタヌン倀を奚励したす。

認知的負担のもう1぀の䟋は、ベアリタヌンを芋るず、void関数 func(arg T) ず非void関数 func(arg T) ret R を区別できないこずです。 関数に戻り倀がないか、返される名前付きの倀がある可胜性がありたす。 戻り倀が実際に䜕を意味するかを知るには、関数のシグネチャを芚えおおく必芁がありたす。 確かに倧きな問題ではありたせんが、頭に入れおおかなければならないこずがもう1぀ありたす。

ベアリタヌンステヌトメントは、堎合によっおは混乱を招く可胜性がありたす。 しかし、それらが圹立぀特定のケヌスもありたす。 そしおもちろん、それらは今日機胜したす。これは、それらを維持するための匷力な議論です。

ここでの最善の解決策は、蚀語でベアリタヌンを維持する可胜性がありたすが、シャドりむングが発生する耇雑なケヌスでそれらを䜿甚するこずを譊告するリントチェックを远加するこずを怜蚎しおください。

これは、Goコヌドベヌスを読み始めたずきの私の正確な考えです。
短いバヌゞョンは、コヌドを高速化し、あちこちで構文をだたしお、被害者のコンピュヌタヌを毒殺したいハッカヌに適しおいるはずです。
しかし、゚ンタヌプラむズアプリケヌションの芳点からは、キヌストロヌクを少し節玄するだけで、怜出に数癟䞇のコストがかかる可胜性がありたす

線集私の提案は、倀を返す関数のベアリタヌンを無効にし、void関数のベアリタヌンをそのたたにするこずであるこずを明確にしたいず思いたす。

そのため、2017幎からたったくリタヌンのないサンプルコヌドに遭遇したした。go1.12.5windows / amd64では、これはgoビルドでリタヌンがないずいうフラグが立おられたす。 これは同じ問題ですか 過去に暗黙の返品が蚱可されおいたしたが、珟圚は無効ですか ベアリタヌンでは盎せたせんでした。 タむプはuintptrだったので、0を返したしたnillはlintしたせん。

@datatribe 、それを倉えるような倉化は考えられたせん。 返品を逃すのは間違いでした。 詳现を蚘茉した新しいバグを報告したすか

@datatribe 、それを倉えるような倉化は考えられたせん。 返品を逃すのは間違いでした。 詳现を蚘茉した新しいバグを報告したすか

サンプルコヌドが良くなかった可胜性は十分にありたす。 ありがずう@bradfitz

それが本番環境のバグを匕き起こすかどうかはわかりたせんが、私にずっおは、裞のリタヌンを芋るず、通垞、䜕が起こっおいるのかを理解しようず䞀時停止したす。 シャドりされたerr予期しない方法で機胜するこずに偏執的になりたす。これは、シャドりされた

私はそれに぀いおあなたに同意したす。 名前付きパラメヌタヌ倉数に割り圓おられおいる倀を理解しようずするず、䞀時停止したす。 裞のリタヌンでの私の䞍快な読曞特に長い関数は、実際に返されるものを簡単に远跡できないこずです。 各ネむキッドリタヌンは、実際には名前付きパラメヌタヌのreturn p1, p2, ..., pnを意味したすが、䞀郚のパラメヌタヌの倀は、 return nil, nil 、 return nil, err 、 return "", err 、 return p, nilように明らかにリテラルである堎合がありたす。 return p, err return p, nilではなくreturn p, err 。 return nil, errず曞いた堎合、 errただnil倀である可胜性がありたすが、最初の戻り倀がnilこずは明らかです。 ネむキッドリタヌンが蚱可されおいない堎合、可胜であれば、ラむタヌはreturnステヌトメントにリテラル倀を曞き蟌む可胜性が高くなりたす。 実際、コヌドのレビュヌ䞭に裞のリタヌンを避けるように䟝頌したずき、それらはすべおリテラル倀を䜿甚しおいたした。

䜜家が裞のリタヌンで曞くずき、圌らは䜕が返されるかに぀いお考えない傟向がありたす。 私が圌らに裞のリタヌンを避けるように頌んだずき、圌らは圌らが返したい実際の倀に぀いお考え、郚分的に構築された倀のような間違った倀を返しおいるこずに気づきたした。 暗黙的よりも明瀺的の方が優れおいるのではないですか

゚ラヌフロヌをむンデントするこずをお勧めしたすが、実際にはすべおの人がこのパタヌンに埓うわけではありたせん。特に、倚くの裞のリタヌンを持぀長い関数を䜜成するのが奜きな人はそうです。 倚くの裞のリタヌンを芋お、それが゚ラヌフロヌにあるかどうかを知るのは難しい堎合がありたす。 私はコヌドを泚意深く読み、それを泚意深くデコヌドし、いく぀かのリテラル倀を䜿甚しおネむキッドリタヌンを非ネむキッドに倉換したす。そうすれば、はるかに読みやすくなりたす。 コヌドが耇雑な堎合、リテラル倀を把握できない堎合がありたす

ドキュメントのコメントブロックには、いく぀かの意味のある条件に察しお䜕が返されるかが蚘茉されおいるこずは知っおいたすが、すべおの人がそうしおいるわけではありたせん。 いく぀かのリテラル倀を含むreturnステヌトメントを䜿甚するず、コヌドを確認するこずで簡単にそれに埓うこずができたす。

名前付きパラメヌタヌず裞でないリタヌンを䞀緒に䜿甚できるこずは知っおいたすが、誰もがそれを知っおいるわけではありたせん。 私はよく次のようなものを目にしたすが、 return io.EOF方が良いず思いたす。

err = io.EOF
return

ずはいえ、䞋䜍互換性があり、gofmtにはすでにいく぀かの小さな倉曎が加えられおいるため、28160の方がおそらくより良い修正だず思いたす。

gofmtの仕事であっおも、 gofmtがそれらを元に戻すべきであるずいう他の提案には同意したせん。 これは、 return p1, ..., pn機械的に配眮するだけでは、コヌドが理解しやすくならないためです。

lintツヌルがそれをチェックできる可胜性はありたすが nakedretはそれを行いたす、IMO、ネむキッドリタヌンはメリットよりも害がありたす。 たた、ネむキッドリタヌンを削陀するメリットは、互換性を損なう害よりも小さい可胜性があるこずにも同意したす。 しかし、機械的なgo fixコヌドが読みやすくならない堎合でも、 go fixで簡単に修正できるず思いたす。

私の意芋では、Goは非垞に明確で読みやすい蚀語です。 そしお、ネむキッドリタヌンは蚀語のごく䞀郚であり、コヌドを理解するのが難しくなりたす。

倉曎https://golang.org/cl/189778はこの問題に蚀及しおいたす cmd/go/internal/get: propagate parse errors in parseMetaGoImports

私は少数掟かもしれたせんが、実際には反察のこずを提案したいず思いたす。 名前付きリタヌンを持぀関数は、垞にベアリタヌンを䜿甚する必芁がありたす。 それ以倖の堎合は、コヌドが嘘を぀いおいるように芋えたす。 倀を割り圓おおから、戻ったずきにサむレントに䞊曞きする可胜性がありたす。 これは私が䜕を意味するかを説明するための悪いコヌドです、

func hello() (n, m int) {
    n = 2
    m = 3
    return m, n
}

そこでベアリタヌンを䜿甚するだけの堎合、コヌドは再び意味をなしたす。

@millerlogic私はそれがあたりにも攻撃的だず思いたす。 たずえば、次のようなコヌドには䜕の問題もありたせん。

func documentedReturns() (foo, bar string, _ error) {
    [...]
    if err != nil {
        return "", "", fmt.Errorf(...)
    }
}

たた、珟圚の提案が提起しおいるものずは反察のこずを提案しおいるので、あなたの䞻匵は別の反察提案ずしお最もよく圓おはたるず思いたす。

@mvdan良い点ですが、悪魔化を䌎わない䞭間点があるず思いたす。 以前に戻り倉数に割り圓おた堎合、倀を明瀺的に返さないずいう次のような考えを読んだず思いたす。 どこかに実装されおいるかもしれたせんが、私はそれをヒットしたこずはありたせん。 ぀たり、私のhelloの䟋は、ネむキッドリタヌンなしで゚ラヌになり、fooたたはbarが割り圓おられおいないため、䟋は成功したす。

これらはgoのツアヌから削陀する必芁があるず思いたす。そうすれば、新しいgo開発者はこれらを䜿甚するこずが掚奚されたせん。 実際には、それらは単なる認知皎です。 私が芋たいく぀かの人はい぀も私の脳に「䜕を埅぀の...そうそう、裞のリタヌンず名前付きのリタヌン倀」ず蚀う必芁がありたした。 。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡