πŸ’¬ КакиС ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?



β—† Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ… инициализация происходит с присваиваниСм ΠΈΠΌ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния, Ρ‚ΠΎ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΌΠ°Π»ΠΎΠ·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌ Π±Π°Π³Π°ΠΌ.



πŸ€” Π§Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ с этим ΠΊΠΎΠ΄ΠΎΠΌ?



func (l loc) getCoordinates(ctx context.Context, address string) (

lat, lng float32, err error) {

isValid := l.validateAddress(address)

if !isValid {

return 0, 0, errors.New("invalid address")}

if ctx.Err() != nil {

return 0, 0, err

}

}





β—† На ΠΏΠ΅Ρ€Π²Ρ‹ΠΈΜ† взгляд ошибка ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΈΜ†. Ошибка, возвращаСмая Π² области видимости if ctx.Err() != nil, β€” это err. Но ΠΌΡ‹ Π½Π΅ присвоили ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΈΜ† err Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния. Π•ΠΈΜ† ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ присвоСно nil. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, этот ΠΊΠΎΠ΄ всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ nil.



β—† Код скомпилируСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ err Π±Ρ‹Π»Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ благодаря ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π‘Π΅Π· присвоСния ΠΈΠΌΠ΅Π½ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π±Ρ‹ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции:



Unresolved reference 'err'





β—† Один ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠ² β€” ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ err Ρ€Π°Π²Π½ΠΎΠΈΜ† ctx.Err():



if err := ctx.Err(); err != nil {

return 0, 0, err

}





β—† ΠœΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ err, Π½ΠΎ сначала присваиваСм Π΅ΠΈΜ† Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ctx.Err(). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ err Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ затСняСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.



β—† Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΈΜ† Ρ‚Π°ΠΊΠΎΠΈΜ† ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ инициализируСтся своим Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.



β—† Π”Ρ€ΡƒΠ³ΠΎΠΈΜ† Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пустой ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ return:



if err = ctx.Err(); err != nil {

return

}





β—† Но ΠΏΡ€ΠΈ этом Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° пустыС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ return с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, Π½ΠΎ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ.



πŸ’‘ ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½Π΅ всСгда Ρ€Π°Π²Π½ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ пустыС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ return. Иногда ΠΌΠΎΠΆΠ½ΠΎ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сигнатуру Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ чистой.