Table des matières
Contenu de la question
solution de contournement
Maison développement back-end Golang Pourquoi *(*string)(unsafe.Pointer(&b)) ne fonctionne pas avec bufio.Reader

Pourquoi *(*string)(unsafe.Pointer(&b)) ne fonctionne pas avec bufio.Reader

Feb 09, 2024 pm 07:54 PM
go语言 string类

为什么 *(*string)(unsafe.Pointer(&b)) 不适用于 bufio.Reader

Dans le langage Go, nous utilisons souvent la conversion de type pour convertir les types de données. Par exemple, convertissez une tranche de type []byte en une chaîne de type chaîne. Normalement, nous pouvons utiliser la fonction `string()` pour effectuer une conversion de type, mais dans certains cas particuliers, cette méthode peut causer des problèmes. Dans le langage Go, la méthode `(string)(unsafe.Pointer(&b))` est appelée méthode "pointeur magique", qui est utilisée pour convertir une tranche de type []byte en une chaîne de type chaîne. Cependant, cette méthode ne fonctionne pas pour le type bufio.Reader. pourquoi ? Répondons à cette question.

Contenu de la question

J'ai un dossier. il a une IP

1

2

3

4

1.1.1.0/24

1.1.2.0/24

2.2.1.0/24

2.2.2.0/24

Copier après la connexion

J'ai lu ce fichier pour le découper et analysé le []octet en chaîne en utilisant *(*string)(unsafe.pointer(&b)) mais cela ne fonctionne pas

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

func testinitiprangefromfile(t *testing.t) {

   filepath := "/tmp/test"

   file, err := os.open(filepath)

   if err != nil {

      t.errorf("failed to open ip range file:%s, err:%s", filepath, err)

   }

   reader := bufio.newreader(file)

   ranges := make([]string, 0)

   for {

      ip, _, err := reader.readline()

      if err != nil {

         if err == io.eof {

            break

         }

         logger.fatalf("failed to read ip range file, err:%s", err)

      }

      t.logf("ip:%s", *(*string)(unsafe.pointer(&ip)))

      ranges = append(ranges, *(*string)(unsafe.pointer(&ip)))

   }

 

   t.logf("%v", ranges)

}

Copier après la connexion

Résultat :

1

2

3

4

5

task_test.go:71: ip:1.1.1.0/24

    task_test.go:71: ip:1.1.2.0/24

    task_test.go:71: ip:2.2.1.0/24

    task_test.go:71: ip:2.2.2.0/24

    task_test.go:75: [2.2.2.0/24 1.1.2.0/24 2.2.1.0/24 2.2.2.0/24]

Copier après la connexion

Pourquoi la version 1.1.1.0/24 a-t-elle été remplacée par la version 2.2.2.0/24 ?

Changement

1

*(*string)(unsafe.Pointer(&ip))

Copier après la connexion

pour string(ip), ça marche

solution de contournement

Donc, en réinterprétant l'en-tête de tranche comme un en-tête de chaîne, la façon dont vous le faites est absolument folle et n'est pas garantie de fonctionner, mais c'est juste indirectementqui cause le problème. p>

Le vrai problème est que vous conservez un pointeur vers la valeur de retour bufio/Reader.ReadLine(), mais la documentation de la méthode dit "Le tampon renvoyé n'est valide que jusqu'au prochain appel à ReadLine." Cela signifie que le lecteur est libre de réutiliser cette mémoire plus tard. c'est-à-dire ce qui se passe.

Lorsque vous effectuez la conversion correctement, string(ip), Go copiera le contenu du tampon dans une chaîne nouvellement créée, qui sera toujours valide dans le futur. Cependant, lorsque vous tapez un jeu de mots slice dans une chaîne, vous conservez exactement le même pointeur, qui cesse de fonctionner une fois que le lecteur remplit sa mémoire tampon.

Si vous décidez d'utiliser l'usurpation de pointeur comme hack de performances pour éviter les copies et les allocations... c'est dommage. L'interface du lecteur vous oblige de toute façon à copier les données, et dans ce cas, vous devez simplement utiliser string().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser la réflexion pour accéder aux champs et méthodes privés dans Golang Comment utiliser la réflexion pour accéder aux champs et méthodes privés dans Golang May 03, 2024 pm 12:15 PM

Comment utiliser la réflexion pour accéder aux champs et méthodes privés dans Golang

Conseils pour créer dynamiquement de nouvelles fonctions dans les fonctions Golang Conseils pour créer dynamiquement de nouvelles fonctions dans les fonctions Golang Apr 25, 2024 pm 02:39 PM

Conseils pour créer dynamiquement de nouvelles fonctions dans les fonctions Golang

La différence entre les tests de performances et les tests unitaires en langage Go La différence entre les tests de performances et les tests unitaires en langage Go May 08, 2024 pm 03:09 PM

La différence entre les tests de performances et les tests unitaires en langage Go

À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? May 07, 2024 pm 12:39 PM

À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ?

Bibliothèques technologiques Golang et outils utilisés dans l'apprentissage automatique Bibliothèques technologiques Golang et outils utilisés dans l'apprentissage automatique May 08, 2024 pm 09:42 PM

Bibliothèques technologiques Golang et outils utilisés dans l'apprentissage automatique

L'évolution de la convention de dénomination des fonctions Golang L'évolution de la convention de dénomination des fonctions Golang May 01, 2024 pm 03:24 PM

L'évolution de la convention de dénomination des fonctions Golang

Le rôle de la technologie Golang dans le développement de l'IoT mobile Le rôle de la technologie Golang dans le développement de l'IoT mobile May 09, 2024 pm 03:51 PM

Le rôle de la technologie Golang dans le développement de l'IoT mobile

Que signifie char en Java Que signifie char en Java May 09, 2024 am 04:51 AM

Que signifie char en Java

See all articles