去领导教程
#教程 #spanish #go

本文是基于上周关于GO的上周的生命,在这里我将用文本和访问源代码进行解释(因此我们不必复制屏幕,我知道:D) 。如果您发现它,可以给它喜欢,分享,评论等。

指针简介

指针与编译器保留存储位置以存储信息的变量不同,它们没有保留的内存位置,并且可以指向我们指出的内存位置。

例如,在下面的示例中,我们声明了一个称为“ V”的变量,其值是“ 4”,然后在屏幕上打印了变量的值及其内存位置(使用'&'符号,我们访问变量的内存位置)。之后,我们声明了指向变量'v'的内存位置的指针“ p”,然后分配了另一个值(使用符号'*'我们访问指针内存的位置的值)。

var v int = 4
var p *int

fmt.Printf( "El valor de v es %d \n", v )
fmt.Printf( "La posición de memória de v es %v \n", &v )

p = &v
*p = 8

fmt.Printf( "El valor de p es %d \n", *p )
fmt.Printf( "La posición de memória de p es %v \n", p )

通过验证者的通过以进行价值

使用指针的应用之一是通过参考将变量传递给函数。当我们将参数传递给“值”编译器的函数时,它的作用就是保留该参数的内存位置并复制值。如果我们这样做是为了“引用”,也就是说,使用指针,我们使用的是相同的内存位置,因此,它会更加推动。

我们在void中以此为例:

package main

import "fmt"

func main() {
    var v int = 4
    var p *int

    p = &v
    *p = 8

    IncValor( v )
    IncReferencia( &v )

    fmt.Printf( "El valor de v es %d \n", v )
    fmt.Printf( "La posición de memória de v es %v \n", &v )

        fmt.Printf( "El valor de p es %d \n", *p )
        fmt.Printf( "La posición de memória de p es %v \n", p )
}

func IncValor( v int  ) {
    v++
    fmt.Printf( "El valor incrementado(Por valor) es %d \n", v )
    }

func IncReferencia( v *int ) {
    *v++
    fmt.Printf( "El valor incrementado(Por referencia) es %d \n", *v )
    }

带有指针的列表

证明其功率的指针的另一种应用是创建数据结构。在空白中,我们创建了一个客户的crud(创建taad-update-delte):

package main

import "fmt"

type Cliente struct {
    nombre string
    telefono string
    next *Cliente
}

var primerCliente *Cliente

func main() {
    AddCliente( "Pepe", "555 555 555" )
        AddCliente( "Juan", "555 555 556" )
        AddCliente( "Rodrigo", "555 555 557" )
        AddCliente( "David", "555 555 558" )

    ListaClientes()

    var cliente *Cliente = GetCliente(2)
    (*cliente).nombre = "Albert"

    fmt.Printf( "\nClientes Update\n" )
    ListaClientes()

    DeleteCliente( 2 )
    fmt.Printf( "\nClientes Delete\n" )
        ListaClientes()
    }

func AddCliente(nombre string, telefono string) {
    var cliente = Cliente{
        nombre:   nombre,
        telefono: telefono,
        next:     nil,
    }

    if primerCliente == nil {
        primerCliente = &cliente

        return
    }

    var nextCliente *Cliente = primerCliente
    for nextCliente.next != nil {
        nextCliente = nextCliente.next
    }

    nextCliente.next = &cliente
}

func ListaClientes() {
    if primerCliente == nil {
        return
    }

    var nextCliente *Cliente = primerCliente
    for nextCliente.next != nil {
        fmt.Printf("Nombre: %s Teléfono: %s \n", nextCliente.nombre, nextCliente.telefono)

        nextCliente = nextCliente.next
    }

    fmt.Printf("Nombre: %s Teléfono: %s \n", nextCliente.nombre, nextCliente.telefono)
}

func GetCliente(pos int) *Cliente {
    if primerCliente == nil {
        return nil
    }

    var nextCliente *Cliente = primerCliente
    i := 0
    for i < pos && nextCliente.next != nil {
        nextCliente = nextCliente.next
        i++
    }

    if i != pos {
        return nil
    }

    return nextCliente
}

func DeleteCliente(pos int) {
    if primerCliente == nil {
        return
    }

    if pos == 0 {
        if primerCliente.next == nil {
            primerCliente = nil

            return
        }

        primerCliente = primerCliente.next
        return
    }

    var cliente *Cliente = GetCliente(pos)
    var previo *Cliente = GetCliente(pos - 1)
    if cliente == nil || previo == nil {
        return
    }

    previo.next = cliente.next
}

在示例中,我们创建了一个结构来存储客户,在该客户也有一个指向下一个客户端的指针。通过这种方式,我们可以从第一个旅行到客户直到找到最后一个(“下一个”指针没有价值),并且要从列表中删除一个,您只需要从链条中删除它(如果是GO,与C不同,不必释放内存,因为它仅使用垃圾收集器进行)。

我们可以针对不同的使用情况优化示例:使用两个指针(一个用于下一个指针,另一项用于前一个指针,以及两个方向上的列表),另一个指针指向列表的结尾,另一种指向指针在列表的一半中,用指针使用迷人订购记录等。

无论如何,我希望您喜欢这些内容,并且一直很喜欢。合作的最佳方法是给他喜欢,评论和分享,看看我们是否使这个社交网络充满了西班牙裔的内容...