2016-11-13 4 views
-2

Ein Zeiger verweist auf einen Speicherort im Speicher. Tatsächlich haben alle Speicheradressen den gleichen Typ unabhängig vom Variablentyp, soweit ich weiß.Was ist der Unterschied zwischen verschiedenen Arten von Zeigern?

Anstatt einen anderen Zeigertyp zu verwenden (*int, *string etc ..), ist dies nur mit einem Typ (var p pointer) für alle Zeigertypen möglich?

Was ist der Unterschied zwischen den verschiedenen Zeigertypen?

package main 

import "fmt" 

func main() { 
    i := 5 
    s := "abc" 

    var pi *int  // alternatively var pi pointer 
    var ps *string // alternatively var ps pointer 

    pi = &i 
    ps = &s 

    fmt.Printf("%p %p", pi, ps) // result is 0x1040e0f8 0x1040a120 
} 

Antwort

2

Das Typsystem in Go wurde entwickelt, um Speicherfehler im Zusammenhang mit Zeigern zu verhindern. Dies ermöglicht es den Programmierern, genug Kontrolle zu haben, um Objekte im Speicher zu manipulieren, während es dem Müllsammler erlaubt ist, das schwere Heben zu manipulieren.
Wenn Sie Zeigerarten manuell speichern und konvertieren müssen, können Sie die unsafe package verwenden.

+0

Vielen Dank für die Antwort. Aber diese Erklärung ist wegen meines Mangels an Informationen für mich weit weg. Ein Zeiger ist ein Verweis auf Speicher, der als 32-Bit- oder 64-Bit-Int dargestellt wird. Ist das richtig ?. Wenn diese Informationen korrekt sind, warum verwenden wir unterschiedliche Zeigertypen, die sich auf den Variablentyp beziehen? Wenn diese Information nicht korrekt ist, was ist die Differenz zwischen den verschiedenen Zeigertypen? –

+2

@AliAltun Zunächst einmal ist ein wichtiger Punkt, dass, wenn alle Zeiger gleich wären, Sie Typinformationen verlieren würden und die Sprache viel weniger effizient und weniger sicher machen würden. Sie möchten nicht, dass eine Funktion '* int' akzeptiert, um' * float' zu akzeptieren, oder Sie verlieren einen der wichtigsten Vorteile einer statisch getippten Sprache. –

0

ist dies möglich, wenn nur ein Typ für alle Zeigertypen verwendet wird?

Ja, das ist so ziemlich wie C funktioniert. Leider macht das die Sprache gefährlich. Angenommen, Sie haben ein Array von 10 Bytes. Wenn Sie den Zeiger übergeben, weiß der andere Code nicht, auf wie viele Bytes er sicher zugreifen kann. Dies führt zu allen Arten von Pufferüberlauffehlern. (d. h. HeartBleed)

In Go weiß der Zeiger den Typ der Sache, auf die er zeigt, so dass er verhindern kann, dass Ihr Code ständig Pufferüberlaufprobleme hat.

Sie können tun, was Sie wollen, aber nur mit dem Unsafe-Paket. Wie der Name schon sagt, ist das eine sehr gefährliche Sache.

Vielleicht, wenn Sie schreiben, was Sie tatsächlich tun, können Menschen Ihnen helfen. Die Verwendung von unsicheren Zeigern ist nicht die einzige Möglichkeit, leistungsfähigen Code zu schreiben.

Verwandte Themen