The recover function relies on the value of the error to make determinations as to whether a panic occurred or not. Since the argument to the panic function is an empty interface, it can be any type. The zero value for any interface type, including the empty interface, is nil. Care must be taken to avoid nil as an argument to panic as demonstrated by this example:

package main

import (
	"fmt"
	"log"
)

func main() {
	divideByZero()
	fmt.Println("we survived dividing by zero!")

}

func divideByZero() {
	defer func() {
		if err := recover(); err != nil {
			log.Println("panic occurred:", err)
		}
	}()
	fmt.Println(divide(1, 0))
}

func divide(a, b int) int {
	if b == 0 {
		panic(nil)
	}
	return a / b
}

# Output:
# Outputwe survived dividing by zero!
Since it is part of the builtin package, recover can be called without importing any additional packages:

package main

import (
	"fmt"
	"log"
)

func main() {
	divideByZero()
	fmt.Println("we survived dividing by zero!")

}

func divideByZero() {
	defer func() {
		if err := recover(); err != nil {
			log.Println("panic occurred:", err)
		}
	}()
	fmt.Println(divide(1, 0))
}

func divide(a, b int) int {
	return a / b
}

# Output:
# Output2009/11/10 23:00:00 panic occurred: runtime error: integer divide by zero
# we survived dividing by zero!

Understand you have a solution but as you were making the attempt using github.com/lestrrat-go/jwx/jwk here is an approach with that package (pretty much what is in the example):


package main

import (
    "context"
    "crypto/rsa"
    "fmt"
    "log"

    "github.com/lestrrat-go/jwx/jwk"
)

func main() {
    // Example jwk from https://www.googleapis.com/oauth2/v3/certs (but with only one cert for simplicity)
    jwkJSON := `{
  "keys": [ 
    {
      "kty": "RSA",
      "n": "o76AudS2rsCvlz_3D47sFkpuz3NJxgLbXr1cHdmbo9xOMttPMJI97f0rHiSl9stltMi87KIOEEVQWUgMLaWQNaIZThgI1seWDAGRw59AO5sctgM1wPVZYt40fj2Qw4KT7m4RLMsZV1M5NYyXSd1lAAywM4FT25N0RLhkm3u8Hehw2Szj_2lm-rmcbDXzvjeXkodOUszFiOqzqBIS0Bv3c2zj2sytnozaG7aXa14OiUMSwJb4gmBC7I0BjPv5T85CH88VOcFDV51sO9zPJaBQnNBRUWNLh1vQUbkmspIANTzj2sN62cTSoxRhSdnjZQ9E_jraKYEW5oizE9Dtow4EvQ",
      "use": "sig",
      "alg": "RS256",
      "e": "AQAB",
      "kid": "6a8ba5652a7044121d4fedac8f14d14c54e4895b"
    }
  ]
}
`

    set, err := jwk.Parse([]byte(jwkJSON))
    if err != nil {
        panic(err)
    }
    fmt.Println(set)
    for it := set.Iterate(context.Background()); it.Next(context.Background()); {
        pair := it.Pair()
        key := pair.Value.(jwk.Key)

        var rawkey interface{} // This is the raw key, like *rsa.PrivateKey or *ecdsa.PrivateKey
        if err := key.Raw(&rawkey); err != nil {
            log.Printf("failed to create public key: %s", err)
            return
        }

        // We know this is an RSA Key so...
        rsa, ok := rawkey.(*rsa.PublicKey)
        if !ok {
            panic(fmt.Sprintf("expected ras key, got %T", rawkey))
        }
        // As this is a demo just dump the key to the console
        fmt.Println(rsa)
    }
}

It is correct that go-client does not have support for metrics type, but in the metrics package there is a pregenerated client that can be used for fetching metrics objects and assign them right away to the appropriate structure. The only thing you need to do first is to generate a config and pass it to metrics client. So a simple client for metrics would look like this:


package main


import (
    "k8s.io/client-go/tools/clientcmd"
    metrics "k8s.io/metrics/pkg/client/clientset/versioned"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)



func main() {
    var kubeconfig, master string //empty, assuming inClusterConfig
    config, err := clientcmd.BuildConfigFromFlags(master, kubeconfig)
    if err != nil{
        panic(err)
    }

    mc, err := metrics.NewForConfig(config)
    if err != nil {
        panic(err)
    }

    mc.MetricsV1beta1().NodeMetricses().Get("your node name", metav1.GetOptions{})
    mc.MetricsV1beta1().NodeMetricses().List(metav1.ListOptions{})
    mc.MetricsV1beta1().PodMetricses(metav1.NamespaceAll).List(metav1.ListOptions{})
    mc.MetricsV1beta1().PodMetricses(metav1.NamespaceAll).Get("your pod name", metav1.GetOptions{})
}

If you choose the DOS-CSV format, Excel is going to encode the document using the 437 codepage (found that here). You can convert it back to UTF-8 using a little bit of code:


Encoding dosEncoding = Encoding.GetEncoding(437);
string original = String.Empty;

using (StreamReader sr = new StreamReader(@"D:\Path\To\output.csv", dosEncoding))
{
    original = sr.ReadToEnd();
    sr.Close();
}

byte[] encBytes = dosEncoding.GetBytes(original);
byte[] utf8Bytes = Encoding.Convert(dosEncoding, Encoding.UTF8, encBytes);

string converted = Encoding.UTF8.GetString(utf8Bytes);

The warp with signal function implements the wrap pattern and can be used to wrap a signal channel and emit an event to the channel even when a panic occurs. In this case, if the recover was not called, you would get a deadlock.


package main

import (
    "errors"
    "fmt"
    "math/rand"
    "time"
)

func main() {
    signal:= make(chan bool)
    go WrapWithSignal(play, signal)()

    if <-signal{
        fmt.Println("Congratulations, you win!")
        return
    }

    fmt.Println("You died.")
}

func play(signal chan bool){
    fmt.Println("Playing russian roulette")
    rand.Seed(time.Now().UnixNano())

    if rand.Intn(2) == 1{
        panic(errors.New("got a bullet"))
    }

    signal <- true
}

The spec is fixed in commit 5bb29fb, and commit 00f9f0c illustrates how panic could took before multiple arguments:


src/pkg/bufio/bufio.go

b, err := NewWriterSize(wr, defaultBufSize)
if err != nil {
    // cannot happen - defaultBufSize is valid size
    - panic("bufio: NewWriter: ", err.String())
    + panic(err)
}

Your own implementation again uses O(n) (and is not very safe to be honest). Nevertheless, you can easily speedup the factorization of a number to O(sqrt n):


factors :: Int -> Int
factors x = go 1
  where
    go :: Int -> Int
    go i | i2 > x = 0
         | i2 == x = 1
         | mod x i == 0 = 2 + go (i+1)
         | otherwise = go (i + 1)
        where i2 = i*i

While wanting to avoid having to convert RTMPT to RTMP, and without having to fork other modules, this was my solution in the end by reading the first byte. Full implementation can be found here.


func createLocalConnection(port string) *net.TCPConn {
    addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:"+port)
    if err != nil {
        panic(err)
    }
    conn, err := net.DialTCP("tcp", nil, addr)
    if err != nil {
        panic(err)
    }
    return conn
}

func proxyConnection(conn *net.TCPConn) {
  defer conn.Close()
  data := make([]byte, 1)
  n, err := conn.Read(data)
  if err != nil {
    fmt.Println(err)
    return
  }

  var proxyConn *net.TCPConn
  if data[0] == 0x03 { // RTMP first byte.
    proxyConn = createLocalConnection(RTMPPort)
  } else {
    proxyConn = createLocalConnection(HTTPPort)
  }
  proxyConn.Write(data[:n])
  defer proxyConn.Close()

  // Request loop
  go func() {
    for {
      data := make([]byte, 1024*1024)
      n, err := conn.Read(data)
      if err != nil {
        break
      }
      proxyConn.Write(data[:n])
    }
  }()

  // Response loop
  for {
    data := make([]byte, 1024*1024)
    n, err := proxyConn.Read(data)
    if err != nil {
      break
    }
    conn.Write(data[:n])
  }
}

func main() {
  listener, err := net.ListenTCP("tcp", addr)
    if err != nil {
        panic(err)
    }

  for {
    conn, err := listener.AcceptTCP()
    if err != nil {
      fmt.Println(err)
      continue
    }

    go server.ProxyConnection(conn)
  }
}

detectmobilebrowsers.com provides this solution (for JS):


(function(a,b){if(/android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))window.location=b})(navigator.userAgent||navigator.vendor||window.opera,'http://detectmobilebrowser.com/mobile');

Recommend

Handling Panics in Go Handling Panics

Handling Panics in Go Deferred Functions

Handling Panics in Go Using the panic Builtin Function

Handling Panics in Go Nil Receivers

Handling Panics in Go Anatomy of a Panic

Handling Panics in Go Understanding Panics Out of Bounds Panics

Como usar o Visual Studio Code para o desenvolvimento remoto por meio do plug-in Remote-SSH Passo 3 — Executando códigos no servidor remoto

Como usar o Visual Studio Code para o desenvolvimento remoto por meio do plug-in Remote-SSH Passo 2 — Configurando o plug-in Remote-SSH e conectando-se ao seu servidor

Handling Errors in Go Handling Errors from Multi-Return Functions

Handling Errors in Go Returning Errors Alongside Values Reducing boilerplate

Handling Errors in Go Returning Errors Alongside Values

Handling Errors in Go Handling Errors

Handling Errors in Go Creating Errors

How To Set Up ProFTPD on Ubuntu 12.04 Step Three—Access the FTP server

How To Set Up ProFTPD on Ubuntu 12.04 Step Two—Configure ProFTP

How To Set Up ProFTPD on Ubuntu 12.04 Step One—Install ProFTP

How To Use the Net-SNMP Tool Suite To Manage and Monitor Servers Issuing Requests Efficiently with SnmpBulkGet and SnmpBulkWalk

How To Use the Net-SNMP Tool Suite To Manage and Monitor Servers Modifying Values with SnmpSet

How To Use the Net-SNMP Tool Suite To Manage and Monitor Servers Retrieve Tabular Data with Formatted Output with SnmpTable

How To Use the Net-SNMP Tool Suite To Manage and Monitor Servers Translate Between Numeric and String OIDs with SnmpTranslate

How To Use the Net-SNMP Tool Suite To Manage and Monitor Servers Using SnmpWalk to Retrieve a Section of the MIB Hierarchy

How To Use the Net-SNMP Tool Suite To Manage and Monitor Servers Retrieving the Next Available OID Value with SnmpGetNext

How To Use the Net-SNMP Tool Suite To Manage and Monitor Servers Retrieving Single OID Values with SnmpGet

How To Use the Net-SNMP Tool Suite To Manage and Monitor Servers Using SNMP Client Commands

How To Configure a MongoDB Replica Set on Ubuntu 20.04 Step 4 — Starting the Replica Set and Adding Members

How To Configure a MongoDB Replica Set on Ubuntu 20.04 Step 3 — Enabling Replication in Each Server’s MongoDB Configuration File

How To Configure a MongoDB Replica Set on Ubuntu 20.04 Step 2 — Updating Each Server’s Firewall Configurations with UFW

How To Configure a MongoDB Replica Set on Ubuntu 20.04 Step 1 — Configuring DNS Resolution

How To Configure a MongoDB Replica Set on Ubuntu 20.04 Prerequisites

An Introduction to the Strings Package in Go Functions for String Manipulation

An Introduction to the Strings Package in Go Determining String Length

An Introduction to the Strings Package in Go String Search Functions