linkedin-skill-assessments-quizzes

Go (langage de programmation)

Q1. De quoi avez-vous besoin pour que deux fonctions soient du même type ?

User defined function types in Go (Golang)

Q2. Que retourne la fonction len() si on lui passe une chaîne encodée en UTF-8 ?

Length of string in Go (Golang).

Q3. Lequel n’est pas un construit de boucle valide en Go ?

      do { ... } while i < 5
      for _,c := range "hello" { ... }
      for i := 1; i < 5; i++ { ... }
      for i < 5 { ... }

Explication : Go ne possède que des boucles for.

Q4. Comment ajouterez-vous le nombre 3 à la fin (à droite) ?

values := []int{1, 1, 2}
      values.append(3)
      values.insert(3, 3)
      append(values, 3)
      values = append(values, 3)

Explication : les slices en Go sont immuables, donc appeler append ne modifie pas la slice en place.

Q5. Quelle est la valeur de Read ?

const (
  Write = iota
  Read
  Execute
)

IOTA in Go (Golang)

Q6. Quelle est la seule instruction import valide en Go ?

      import "github/gin-gonic/gin"
      import "https://github.com/gin-gonic/gin"
      import "../template"
      import "github.com/gin-gonic/gin"

Import in GoLang

Q7. Que se passerait-il si vous tentiez de compiler et d’exécuter ce programme Go ?

package main
var GlobalFlag string
func main() {
  print("["+GlobalFlag+"]")
}
  1. Les variables en Go ont des valeurs initiales. Pour string, c’est la chaîne vide.
  2. Go Playground

Q8. Où la variable myVar est-elle accessible si elle est déclarée en dehors de toute fonction dans un fichier du paquet myPackage situé dans le module myModule ?

Explication : pour rendre la variable disponible en dehors de myPackage, changez son nom en MyVar. Voir aussi un exemple de noms exportés dans le Tour of Go.

Q9. Comment demander à go test d’afficher les tests qu’il exécute ?

test package

Q10. Ce code a affiché {0, 0}. Comment le corriger ?

type Point struct {
  x int
  y int
}

func main() {
  data := []byte(`{"x":1, "y": 2}`)
  var p Point
  if err := json.Unmarshal(data, &p); err != nil {
    fmt.Println("error: ", err)
  } else {
    fmt.Println(p)
  }
}
  1. How to Parse JSON in Golang?
  2. Go Playground

Q11. Qu’est-ce qu’un sync.Mutex bloque pendant qu’il est verrouillé ?

  1. Mutex in GoLang, sync.Mutex verrouille pour qu’une seule goroutine à la fois accède à la variable protégée.
  2. sync.Mutex

Q12. Quelle est la manière idiomatique de suspendre l’exécution de la portée courante jusqu’à ce qu’un nombre arbitraire de goroutines aient terminé ?

Explication : c’est exactement l’usage de sync.WaitGroup - Use sync.WaitGroup in Golang

Q13. Quel est l’effet secondaire d’utiliser time.After dans une instruction select ?

Remarque : cela ne bloque pas select et ne bloque pas les autres canaux.

  1. time.After() Function in Golang With Examples
  2. How can I use ‘time.After’ and ‘default’ in Golang?
  3. Go Playground example

Q14. À quoi sert l’instruction select ?

Select statement in GoLang

Q15. Selon le standard de documentation Go, comment devriez-vous documenter cette fonction ?

func Add(a, b int) int {
        return a + b
}

Explication : le bloc de documentation doit commencer par le nom de la fonction.

Comments in Go

Q16. Quelle contrainte s’applique au type de myVal pour compiler i := myVal.(int) ?

Explication : ce type d’assertion de type (via .(type)) s’utilise uniquement sur des interfaces.

  1. this example
  2. Primitive types are type-casted differently
  3. Go Playground
  4. Type assertions

Q17. Qu’est-ce qu’un canal (channel) ?

Channels

Q18. Comment faire en sorte qu’un fichier ne se compile que sur Windows ?

  1. How to use conditional compilation with the go build tool, Oct 2013
  2. go commands Build constraints

//go:build windows « Les versions de Go 1.16 et antérieures utilisaient une syntaxe différente pour les contraintes de build, avec le préfixe // +build. La commande gofmt ajoutera une contrainte //go:build équivalente en rencontrant l’ancienne syntaxe. »

Q19. Quelle est la bonne manière de passer ceci comme corps d’une requête HTTP POST ?

data := "A group of Owls is called a parliament"
  resp, err := http.Post("https://httpbin.org/post", "text/plain", []byte(data))
      resp, err := http.Post("https://httpbin.org/post", "text/plain", data)
      resp, err := http.Post("https://httpbin.org/post", "text/plain", strings.NewReader(data))
      resp, err := http.Post("https://httpbin.org/post", "text/plain", &data)
  1. net/http#Client.Post
  2. http.Post Golang example

Q20. Quel devrait être le nom idiomatique d’une interface avec une seule méthode ayant la signature Save() error ?

Effective Go, Interface names

Q21. Une instruction switch _ son propre bloc lexical. Chaque instruction case _ un bloc lexical supplémentaire

Go Language Core technology (Volume one) 1.5-scope

Extrait pertinent de l’article :

Le second if est imbriqué dans le premier, donc une variable déclarée dans le premier if est visible dans le second. Il y a des règles similaires dans switch : chaque case possède son propre bloc lexical en plus du bloc conditionnel.

Q22. Quelle est la sensibilité à la casse par défaut de la fonction JSON Unmarshal ?

encoding/json#Unmarshal

Extrait pertinent :

To unmarshal JSON into a struct, Unmarshal matches incoming object keys to the keys used by Marshal (either the struct field name or its tag), preferring an exact match but also accepting a case-insensitive match. By default, object keys which don’t have a corresponding struct field are ignored (see Decoder.DisallowUnknownFields for an alternative).

Q23. Quelle est la différence entre les méthodes Time.Sub() et Time.Add() du paquet time ?

  1. time#Time.Add
  2. time#Time.Sub

Q24. Quel est le risque d’utiliser plusieurs tags de champ dans une même struct ?

  1. Example Code / b29r0fUD1cp
  2. How To Use Struct Tags in Go

Q25. Où la méthode intégrée recover est-elle utile ?

Example of Recover Function in Go (Golang)

Extrait pertinent :

Recover is useful only when called inside deferred functions. Executing a call to recover inside a deferred function stops the panicking sequence by restoring normal execution and retrieves the error message passed to the panic function call. If recover is called outside the deferred function, it will not stop a panicking sequence.

Q26. Lequel des choix ne renvoie pas de sortie sur la sortie d’erreur standard ?

  1. func println : écrit le résultat sur l’erreur standard.
  2. func New : func New(out io.Writer, prefix string, flag int) *Logger; le paramètre out définit la destination d’écriture des logs.
  3. func Errorf : Errorf formate selon un spécificateur et retourne la chaîne comme valeur.
  4. func Fprintln : écrit dans w.

Q27. Comment indiquer à Go d’importer un paquet depuis un autre emplacement ?

  1. Call your code from another module : chapitre 5., go mod edit -replace example.com/greetings=../greetings.
  2. go.mod replace directive

Q28. Si votre répertoire de travail actuel est la racine de votre projet, quelle commande exécutera tous ses paquets de test ?

  1. Example of testing in Go (Golang)
  2. Example of cmd in Go (Golang)

Extrait pertinent :

Relative patterns are also allowed, like “go test ./…” to test all subdirectories.

Q29. Quelles encodages pouvez-vous mettre dans une chaîne ?

  1. Strings, bytes, runes and characters in Go

Extrait pertinent :

In short, Go source code is UTF-8, so the source code for the string literal is UTF-8 text.

  1. Example of encoding in Go (Golang)

Extrait pertinent :

Package encoding defines an interface for character encodings, such as Shift JIS and Windows 1252, that can convert to and from UTF-8.

Q30. En quoi le comportement de t.Fatal diffère-t-il à l’intérieur d’un t.Run ?

  1. Reference:
  2. testing package in Go, extrait pertinent :

Fatal is equivalent to Log followed by FailNow. Log formats its arguments using default formatting, analogous to Println, and records the text in the error log. FailNow marks the function as having failed and stops its execution by calling runtime.Goexit (which then runs all deferred calls in the current goroutine). Execution will continue at the next test or benchmark. FailNow must be called from the goroutine running the test or benchmark function, not from other goroutines created during the test. Calling FailNow does not stop those other goroutines. Run runs f as a subtest of t called name. It runs f in a separate goroutine and blocks until f returns or calls t.Parallel to become a parallel test. Run reports whether f succeeded (or at least did not fail before calling t.Parallel). Run may be called simultaneously from multiple goroutines, but all such calls must return before the outer test function for t returns.

Q31. Que fait log.Fatal ?

Example of func Fatal in Go (Golang)

Extrait pertinent :

Fatal is equivalent to Print() followed by a call to os.Exit(1).

Q32. Lequel est un littéral de format d’heure valide en Go ?

func Time in Go

Extrait pertinent :

Year: "2006" "06"
Month: "Jan" "January" "01" "1"
Day of the week: "Mon" "Monday"
Day of the month: "2" "_2" "02"
Day of the year: "__2" "002"
Hour: "15" "3" "03" (PM or AM)
Minute: "4" "04"
Second: "5" "05"
AM/PM mark: "PM"

Q33. Comment devriez-vous journaliser une erreur (err) ?

Explication : Il n’y a ni log.ERROR, ni log.Error() dans le paquet log en Go ; les arguments de log.Print() sont gérés comme fmt.Print() ; ceux de log.Printf() comme fmt.Printf().

Q34. Quels noms de fichiers la commande go test reconnaît-elle comme fichiers de test ?

  1. Test packages in go command in Go : « ‘Go test’ recompile chaque paquet avec tous les fichiers dont le nom matche le motif *_test.go. »
  2. Add a test in Go

Q35. Quelle sera la sortie de ce code ?

ch := make(chan int)
ch <- 7
val := <-ch
fmt.Println(val)

Go Playground share, sortie :

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
 /tmp/sandbox2282523250/prog.go:7 +0x37

Program exited.

Q36. Quelle sera la sortie de ce programme ?

ch := make(chan int)
close(ch)
val := <-ch
fmt.Println(val)
  1. The Go Programming Language Specification “Receive operator”, extrait pertinent :

    A receive operation on a closed channel can always proceed immediately, yielding the element type’s zero value after any previously sent values have been received.

  2. Go Playground share, sortie :

0

Program exited.

Q37. Qu’est-ce qui sera affiché par ce code ?

var stocks map[string]float64 // stock -> price
price := stocks["MSFT"]
fmt.Printf("%f\n", price)

Go Playground share, sortie :

0.000000

Program exited.

Q38. Quelle est la manière courante d’avoir plusieurs exécutables dans votre projet ?

  1. stackoverflow
  2. medium
  3. medium

Q39. Comment compiler main.go en un exécutable qui fonctionnera sur OSX arm64 ?

documentation

Q40. Quelle est la syntaxe correcte pour démarrer une goroutine qui va print Hello Gopher! ?

Example of start a goroutine

Q41. Si vous itérez sur une map dans une boucle for range, dans quel ordre les paires clé:valeur seront-elles accédées ?

Reference

Q42. Quelle est la manière idiomatique de personnaliser la représentation d’une struct personnalisée dans une chaîne formatée ?

Reference

Q43. Comment éviter une fuite de goroutine dans ce code ?

func findUser(ctx context.Context, login string) (*User, error) {
    ch := make(chan *User)
    go func() {
            ch <- findUserInDB(login)
    }()

    select {
    case user := <-ch:
            return user, nil
    case <-ctx.Done():
            return nil, fmt.Errorf("timeout")
    }
}

Reference

Extrait pertinent :

The simplest way to resolve this leak is to change the channel from an unbuffered channel to a buffered channel with a capacity of 1. Now in the timeout case, after the receiver has moved on, the Goroutine will complete its send by placing the *User value in the channel then it will return.

44. Qu’est-ce que ce code va afficher ?

var i int8 = 120
i += 10
fmt.Println(i)

Go Playground example, sortie :

-126

Program exited.

45. Étant donné la définition de worker ci-dessous, quelle est la bonne syntaxe pour démarrer une goroutine qui appellera worker et enverra le résultat dans un canal nommé ch ?

func worker(m Message) Result
go func() {
    r := worker(m)
    ch <- r
}
go func() {
    r := worker(m)
    r -> ch
} ()
go func() {
    r := worker(m)
    ch <- r
} ()
go ch <- worker(m)

Go Playground example

Q46. Dans ce code, quels noms sont exportés ?

package os

type FilePermission int
type userID int

Reference 1 Reference 2

Q47. Laquelle des affirmations suivantes est correcte à propos des structures en Go ?

Q48. Que fait la commande intégrée generate du compilateur Go ?

Generate Go files by processing source

Q49. En utilisant le paquet time, comment obtenir l’heure dans 90 minutes ?

func (Time) Add example

Q50. Un programme utilise un canal pour imprimer cinq entiers dans une goroutine tout en alimentant le canal depuis la routine principale, mais cela ne fonctionne pas tel quel. Que faut-il changer pour le faire fonctionner ?

Reference

Extrait pertinent :

The simplest way to resolve this leak is to change the channel from an unbuffered channel to a buffered channel with a capacity of 1. Now in the timeout case, after the receiver has moved on, the Goroutine will complete its send by placing the *User value in the channel then it will return.

Q51. Après avoir importé encoding/json, comment accéderiez-vous à la fonction Marshal ?

encoding/json#Marshal example

Q52. Quels sont les deux segments de code manquants pour compléter l’utilisation de context.Context afin d’implémenter un timeout de trois secondes pour ce client HTTP effectuant une requête GET ?

package main

import (
        "context"
        "fmt"
        "net/http"
)

func main() {
        var cancel context.CancelFunc
        ctx := context.Background()

        // #1: <=== What should go here?

        req, _ := http.NewRequest(http.MethodGet,
                "https://linkedin.com",
                nil)

        // #2: <=== What should go here?

        client := &http.Client{}
        res, err := client.Do(req)
        if err != nil {
                fmt.Println("Request failed:", err)
                return
        }
        fmt.Println("Response received, status code:",
                res.StatusCode)
}
      ctx.SetTimeout(3*time.Second)
      req.AttachContext(ctx)
      ctx, cancel = context.WithTimeout(ctx, 3*time.Second); defer cancel()
      req = req.WithContext(ctx)
      ctx, cancel = context.WithTimeout(ctx, 3*time.Second); defer cancel() #2: req.AttachContext(ctx)
      ctx.SetTimeout(3*time.Second)
      req = req.WithContext(ctx)
  1. context#WithTimeout
  2. net/http#Request.WithContext

Q53. Si vous avez une struct nommée Client définie dans le même fichier .go que l’instruction, comment exporter une variable avec une valeur par défaut pour qu’elle soit accessible par d’autres paquets ?

Q54. Ce programme affiche {Master Chief Spartan Protagonist Halo}. Comment faire pour qu’il affiche Master Chief - a Spartan - is the Protagonist of Halo à la place ?

package main

import "fmt"

type Character struct{
        Name  string
        Class string
        Role  string
        Game  string
}

func main() {
        mc := Character{
                Name: "Master Chief",
                Class: "Spartan",
                Role: "Protagonist",
                Game: "Halo",
        }
        fmt.Println(mc)
}
  1. fmt#Stringer

Q55. Comment implémenter une méthode Append() fonctionnelle pour Clients ?

package main

type Client struct {
  Name string
}
type Clients struct {
  clients []*Client
}
func main() {
  c:= &Clients{clients.make([]*Client,0)}
  c.Append(&Client{Name: "LinkedIn API})
}

Q56. Comment récupérer d’un panic() déclenché par une fonction appelée sans laisser votre programme échouer, en supposant que votre réponse s’exécute dans la même portée où l’appel de fonction provoquera le panic ?

Q57. Qu’est-ce que ce code va afficher ?

var n int
fmt.Println (n)

En Go, lorsqu’une variable est déclarée sans initialisation explicite, elle reçoit sa valeur zéro selon son type. Pour les entiers comme n, la valeur zéro est 0.

Q58. Lors de la création d’une chaîne formatée, quel verbe devez-vous utiliser pour appeler la méthode String() string d’un type personnalisé ?

En Go, le verbe %s est utilisé pour formater une chaîne. Lorsqu’il est utilisé avec un type personnalisé ayant une méthode String(), celle-ci est appelée automatiquement et sa valeur de retour est utilisée dans la chaîne formatée.

Q59. Lequel n’est pas une valeur valide pour layout lors de l’appel de time.Now().Format(layout) ?

time#Time.Format

Selon la documentation, la valeur 1 et 01 représentent le mois courant.

each layout string is a representation of the time stamp,
	Jan 2 15:04:05 2006 MST
An easy way to remember this value is that it holds, when presented in this order, the values (lined up with the elements above):
	  1 2  3  4  5    6  -7

Q60. Comment signaler au compilateur Go que la struct Namespace doit implémenter l’interface JSONConverter ? Cette question suppose que la réponse sera incluse dans le même package où Namespace est déclarée.

Cette syntaxe crée une variable _ de type JSONConverter et lui assigne la valeur (*Namespace)(nil). Cela vérifie que Namespace satisfait l’interface JSONConverter en s’assurant qu’elle peut être affectée à une variable de type JSONConverter.

Q61. Quelle affirmation à propos du typage et des interfaces est fausse ?

En Go, un type satisfait automatiquement une interface s’il implémente toutes ses méthodes. Il n’y a pas besoin de déclarer explicitement qu’une struct implémente une interface via un mot-clé spécifique.

Q62. Comment compléter ce programme pour générer la sortie indiquée, en supposant la table SQL ?

===[Output]================
1: &{GameId:1 Title:Wolfenstein YearReleased:1992}
2: &{GameId:2 Title:Doom YearReleased:1993}
3: &{GameId:3 Title:Quake YearReleased:1996}

===[main.go]================
package main

import (
        "database/sql"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
        "log"
)

type Game struct {
        GameId       int
        Title        string
        YearReleased int
}

func main() {

        conn, err := sql.Open("mysql",
                "john_carmack:agiftw!@tcp(localhost:3306)/idsoftware")

        if err != nil {
                panic(err)
        }
        defer func() { _ = conn.Close() }()

        results, err := conn.Query("SELECT game_id,title,year_released FROM games;")
        if err != nil {
                panic(err)
        }
        defer func() { _ = results.Close() }()

        // #1 <=== What goes here?

        for results.Next() {
                var g Game

                // #2 <=== What goes here?

                if err != nil {
                        panic(err)
                }

                // #3 <=== What goes here?

        }

        for i, g := range games {
                fmt.Printf("%d: %+v\n", i, g)
        }

}
#1: games := make([]*Game, results.RowsAffected())
#2: g, err = results.Fetch()
#3: games[results.Index()] = &g
#1: games := []Game{}
#2: g, err = results.Fetch()
#3: games = append(games,g)
#1: games := map[int]Game{}
#2: err = results.Scan(&g)
#3: games[g.GameId] = g
#1: games := make(map[int]*Game, 0)
#2: err = results.Scan(&g.GameId, &g.Title, &g.YearReleased)
#3: games[g.GameId] = &g

Q63. Complétez les blancs

  1. Les fichiers de test en Go doivent _.
  2. Les tests individuels sont identifiés par _.
  3. Vous pouvez exécuter des sous-tests en _.
  4. Vous journalisez l’erreur et marquez le test comme échoué en _.

Q64. Pour quel type rune est-il un alias ?

  1. Strings, bytes, runes and characters in Go

Extrait pertinent :

The Go language defines the word rune as an alias for the type int32, so programs can be clear when an integer value represents a code point.

Q65. Quand pouvez-vous utiliser la syntaxe := pour affecter à plusieurs variables ? Par exemple :

x, err := myFunc()
  1. Short variable declarations

Q66. Comment afficher la sortie du profileur dans cpu.pprof dans le navigateur ?

Q67. Quand une variable de type interface{} est-elle évaluée à nil ?

Q68. Quelle valeur une variable string contient-elle si elle a été allouée mais non affectée ?

Si une variable string a été allouée mais non affectée, sa valeur par défaut est une chaîne vide “”. En Go, les variables non initialisées reçoivent la valeur zéro de leur type, pour les chaînes c’est “”.

Q69. Quelle fonction intégrée est utilisée pour arrêter la poursuite d’un programme ?

La fonction intégrée utilisée pour arrêter un programme est panic(). Lorsqu’elle est appelée, elle déclenche une panique qui interrompt le flot normal du programme. Si elle n’est pas récupérée, le programme se termine.

Q70. Quelle sera la sortie ?

a,b := 1, 2
b,c:= 3, 4
fmt.Println(a, b, c)

Go Playground Example

Q71. Quel est l’opérateur pour une condition ET logique ?

Q72. Qu’est-ce qu’une fonction anonyme en Go ?

Q73. Quel mot-clé est utilisé pour déclarer une fonction anonyme en Go ?

Q74. Quel est l’avantage principal d’utiliser des fonctions anonymes en Go ?

Explication : elles peuvent être définies en ligne là où elles sont utilisées, offrant plus de flexibilité d’organisation du code.

Q75. Quelle est la syntaxe pour appeler immédiatement une fonction anonyme après sa déclaration en Go ?

reference

Q76. Pour quels types les développeurs Go peuvent-ils définir des méthodes ?

Les méthodes peuvent être définies pour tout type nommé qui n’est pas un type intégré. Lorsqu’on crée un nouveau type via une déclaration type, il devient un type nommé, et on peut définir des méthodes spécifiques à ce type. Les méthodes ne peuvent pas être attachées directement aux types intégrés comme int, string, etc. reference