AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-10089194

user10089194's questions

Martin Hope
user10089194
Asked: 2025-02-13 15:56:36 +0800 CST

comportamento recover() em Go quando chamado dentro de uma função aninhada adiada [duplicado]

  • 3
Esta pergunta já tem uma resposta aqui :
Por que golang não consegue se recuperar de um pânico em uma função chamada pela função defer [duplicado] (1 resposta)
Fechado ontem .

Entendo o seguinte ponto em relação ao recover()comportamento em Go. recover()Segue avaliação imediata, mas execução atrasada .

Então, se ele não for chamado dentro de uma função adiada (trecho de código 1), ele recover()será avaliado naquele momento e, nesse ponto, ele ainda estará lá nile, portanto, nosso código entra em pânico.

Se for chamado dentro de uma função adiada, a chamada da função será registrada, mas recover() será chamada depois que ocorrer panice será recuperada com sucesso.

package main

import "fmt"

func main() {
    defer recover() // since not called inside a deferred func, it will not recover successfully

    panic("This is a panic")

}

Agora, tendo isso em mente, escrevi o código abaixo.

import (
    "fmt"
)

func main() {

    defer func(){
        customRecover()
    }()

    panic("This is a panic")

}

func customRecover(){
    if r:= recover(); r!= nil{
        fmt.Println("Custom Recovery for: ",r)
    }
}

Pesquisei online o raciocínio e obtive a mesma resposta que

O valor de retorno de recover é nulo se qualquer uma das seguintes condições for atendida:

  • o argumento do pânico era nulo;
  • a goroutine não está em pânico;
  • recover não foi chamado diretamente por uma função adiada.

Mas não consigo entender por que o segundo snippet não está funcionando?!?

Ela satisfaz todas as 3 condições estritamente falando. Há alguma ressalva que eu esteja esquecendo? Acho que a 3ª condição não é satisfeita porque ela não é chamada diretamente, mas por meio de uma chamada de função aninhada. Mas por que ela precisa estar dentro de deferred somente?

Perguntas semelhantes: aqui , aqui , aqui e aqui .

go
  • 1 respostas
  • 42 Views
Martin Hope
user10089194
Asked: 2025-02-07 00:03:37 +0800 CST

Padrão or-done-channel em Go - por que não há retorno dentro da seleção interna e o que acontece se os canais done e producers estiverem disponíveis?

  • 5

Lendo simultaneidade em Go .

Tentando entender o padrão do canal or-done .

Estou com dificuldade para entender o fluxo de execução.

Mencionei o número na linha de onde vem minha dúvida.

  1. Por que nenhuma returndeclaração em inner <-donecomo temos em outer select? Por causa de nenhuma returndeclaração, a próxima iteração será executada e se nessa iteração tivermos ambos <- donee <-cdisponíveis. Sabemos select-caseque escolheremos qualquer um dos casos arbitrariamente se vários casos estiverem disponíveis. Isso significa que há uma possibilidade de que <-cserá executado mesmo se <-doneestiver disponível?

  2. Já que select-casearbitrariamente escolhe um caso quando vários casos estão disponíveis, é correto assumir que o <- doneserá escolhido eventualmente , mas não é necessário que seja escolhido imediatamente assim que for fechado. Claro, essa dúvida é quando ambos os casos, ie <-donee <-cestavam disponíveis.

  3. Existe uma possibilidade que <- vnão está escrita valStreamquando doneé fechada e é perdida para sempre, correto?

orDone := func(done, c <-chan interface{}) <-chan interface{} {
    valStream := make(chan interface{})
    go func() {
        defer close(valStream)
        for {
            select {                   //2
            case <-done:
                return
            case v, ok := <-c:
                if ok == false {
                    return
                }
                select {
                case valStream <- v:   //3
                case <-done:           //1
                }
            }
        }
    }()
    return valStream
}

insira a descrição da imagem aqui

Basicamente, corrija-me se eu estiver errado ou confirme que meu entendimento da execução está correto. De fato, há "brechas" no código e isso é apenas comportamento do canal aqui.

Pergunta semelhante aqui

go
  • 1 respostas
  • 35 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve