Heim > Backend-Entwicklung > Golang > Warum *(*string)(unsafe.Pointer(&b)) nicht mit bufio.Reader funktioniert

Warum *(*string)(unsafe.Pointer(&b)) nicht mit bufio.Reader funktioniert

王林
Freigeben: 2024-02-09 19:54:17
nach vorne
1059 Leute haben es durchsucht

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

In der Go-Sprache verwenden wir häufig die Typkonvertierung, um Datentypen zu konvertieren. Konvertieren Sie beispielsweise ein Slice vom Typ []Byte in einen String vom Typ String. Normalerweise können wir die Funktion „string()“ verwenden, um eine Typkonvertierung durchzuführen, aber in einigen Sonderfällen kann diese Methode Probleme verursachen. In der Go-Sprache wird die Methode „(string)(unsafe.Pointer(&b))“ als „Magic Pointer“-Methode bezeichnet, die zum Konvertieren eines Slice vom Typ []Byte in einen String vom Typ String verwendet wird. Diese Methode funktioniert jedoch nicht für den Typ bufio.Reader. Warum? Beantworten wir diese Frage.

Frageninhalt

Ich habe eine Datei. Es hat eine IP

1.1.1.0/24
1.1.2.0/24
2.2.1.0/24
2.2.2.0/24
Nach dem Login kopieren

Ich habe diese Datei zum Slicen gelesen und das []Byte mit *(*string)(unsafe.pointer(&b)) in einen String analysiert, aber es funktioniert nicht

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)
}
Nach dem Login kopieren

Ergebnis:

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]
Nach dem Login kopieren

Warum wurde 1.1.1.0/24 in 2.2.2.0/24 geändert?

Veränderung

*(*string)(unsafe.Pointer(&ip))
Nach dem Login kopieren

in string(ip) funktioniert es

Problemumgehung

Während Sie also den Slice-Header als String-Header uminterpretieren, ist die Art und Weise, wie Sie es tun, absolut verrückt und es ist nicht garantiert, dass es funktioniert, aber das verursacht nur indirektdas Problem. p>

Das eigentliche Problem besteht darin, dass Sie einen Zeiger auf den bufio/Reader.ReadLine() Rückgabewert beibehalten, in der Dokumentation der Methode jedoch steht: „Der zurückgegebene Puffer ist nur bis zum nächsten Aufruf von ReadLine gültig. Dies bedeutet, dass der Leser diesen Speicher später wiederverwenden kann.“ Das ist, was los ist.

Wenn Sie die Konvertierung richtig durchführen string(ip), kopiert Go den Inhalt des Puffers in eine neu erstellte Zeichenfolge, die auch in Zukunft gültig ist. Wenn Sie jedoch das Slice-Wortspiel in die Zeichenfolge eingeben, behalten Sie genau denselben Zeiger, der nicht mehr funktioniert, sobald der Reader seinen Puffer wieder auffüllt.

Wenn Sie sich dafür entscheiden, Pointer-Spoofing als Performance-Hack zu verwenden, um Kopien und Zuweisungen zu vermeiden, ist das schade. Die Leseschnittstelle zwingt Sie ohnehin dazu, die Daten zu kopieren, daher sollten Sie einfach string() verwenden.

Das obige ist der detaillierte Inhalt vonWarum *(*string)(unsafe.Pointer(&b)) nicht mit bufio.Reader funktioniert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage