Programação orientada a objetos Golang

Programação orientada a objetos Golang

* Catálogo
00 Instruções de programação orientada a objetos em linguagem Golang
01 Campos, atributos
02 Método
03 Programação orientada a objetos
04 Modo de fábrica
05 Idéias de programação orientada a objetos *

00 Instruções de programação orientada a objetos da linguagem Golang

  • Golang também suporta a programação orientada a objetos (OOP), mas é diferente da programação orientada a objetos tradicional e não é uma linguagem orientada a objetos pura. Portanto, é mais correto dizer que Golang oferece suporte a recursos de programação orientada a objetos.

  • Golang não tem classe. A estrutura da linguagem Go tem o mesmo status que a classe de outras linguagens de programação. Você pode entender que Golang implementa recursos OOP com base em struct.

  • A programação orientada a objetos Golang é muito concisa, removendo a herança da linguagem OOP tradicional, sobrecarga de método, construtor e destruidor, oculto este ponteiro, etc.

  • Golang ainda tem as características de herança, encapsulamento e polimorfismo da programação orientada a objetos, mas a implementação é diferente de outras linguagens OOP, como herança: Golang não tem a palavra-chave extends e a herança é obtida por meio de campos anônimos.

  • Golang orientado a objetos (OOP) é ​​muito elegante, OOP em si é uma parte do sistema de tipo de linguagem (sistema de tipo), através da associação de interface (interface), baixo acoplamento e muito flexível. Em outras palavras, a programação orientada à interface é um recurso muito importante no Golang.

A diferença e conexão entre estrutura e variável de estrutura (instância)

  • A estrutura é um tipo de dados personalizado, representando uma classe de coisas

  • Variáveis ​​de estrutura (instâncias) são concretas, reais e representam uma variável concreta

Como declarar uma estrutura

tipo estrutura nome struct { 
    campo1 tipo 
    campo2 tipo 
    ... 
}

Definir a estrutura do cão

tipo Dog struct { 
    Name string 
    Age int64 
    Color string}

01 campo, atributo

  • Do ponto de vista do conceito ou nome: estrutura campo = atributo = campo

  • O campo é um componente da estrutura, geralmente um tipo de dados básico, uma matriz, mas também um tipo de referência

Notas e detalhes

  • A sintaxe da declaração do campo é a mesma das variáveis, exemplo: nome do campo tipo de campo

  • O tipo de campo pode ser: tipo básico, array ou tipo de referência

  • Depois de criar uma variável de estrutura, se nenhum valor for atribuído ao campo, ele corresponde a um valor zero (o valor padrão), e as regras são as mesmas que as anteriores:

    • Use a fatia para garantir: p1.slice1 = make ([] int, 10)

    • Use o mapa para ter certeza: p1.map1 = make (map [string] string)

    • O tipo booleano é falso, o valor é 0 e a string é ""

    • O valor padrão do tipo de array está relacionado ao seu tipo de elemento, por exemplo, score [3] int é [0,0, 0]

    • O valor zero do ponteiro, fatia e mapa são todos nulos, ou seja, nenhum espaço foi alocado ainda

  • Os campos de diferentes variáveis ​​de estrutura são independentes e não afetam uns aos outros, e a estrutura é um tipo de valor.

Crie variáveis ​​de estrutura e acesse campos de estrutura

var dd Dogvar dd Cachorro = Pessoa {"小花", 4, "red"} var dd * Cachorro = novo (Cachorro) 
(* dd) .Nome = "小花" dd.Nome = "小花" var dd * Cachorro = & Cachorro {"小花", 4, "red"} var dd * Dog = & Dog {} 
(* dd) .Name = "小花" dd.Name = "小花"

Descrição:

1) 
O terceiro e o quarto métodos retornam ponteiros de estrutura. 2) 
A forma padrão de ponteiros de estrutura para acessar campos deve ser: (* Ponteiro de estrutura). Nome do campo, 
como (* pessoa) .Nome = "tom" 3) Mas go fez uma simplificação e 
também suporta ponteiros de estrutura. Campo 
Primeiro nome, como pessoa.Nome = "tom". 3) A 
camada inferior do compilador go converteu person.Name (* person) .Name.

Precauções e detalhes para o uso da estrutura

  • Todos os campos da estrutura são contínuos na memória

  • A estrutura é um tipo definido separadamente pelo usuário, e deve ter exatamente os mesmos campos (nome, número e tipo) ao converter com outros tipos

  • A estrutura é redefinida por tipo (equivalente a aliasing). Golang o considera um novo tipo de dados, mas pode ser forçado a se transferir um para o outro.

  • Uma tag pode ser escrita em cada campo da estrutura, e a tag pode ser obtida através do mecanismo de reflexão.Os cenários de uso comuns são serialização e desserialização.

Método 02

O método em Golang funciona no tipo de dados especificado (ou seja: vinculado ao tipo de dados especificado), portanto, os tipos personalizados podem ter métodos, não apenas struct.

Declaração e chamada de método

tipo A struct { 
    Num int} func (a A) test () { 
    fmt.Println (a.Num) 
}

Descrição

  • func (a A) test (O livro indica que a estrutura A tem um método, o método é chamado de teste

  • (aA) reflete que o método de teste está vinculado ao tipo A

pacote mainimport ("fmt") tipo Person struct { 
    Name string} func (P Person) test ({ 
    fmt.Println ("test ((name =", p.Name) func main () {var p Personp.Name = " tom " 
    p.test () // Chamar método 
} 

// 1) O método de teste é vinculado ao tipo Person 
// 2) O método de teste só pode ser chamado por uma variável do tipo Person e não pode ser chamado diretamente, nem outros tipos de variáveis ​​podem ser usados. Para chamar 
// func (p Person) test () .... p representa qual variável Person é chamada, e este p é uma cópia dela, que geralmente é semelhante à passagem de função. 
// 4) O nome p é especificado pelo programador e não é fixo. Por exemplo, pode ser alterado para pessoa

O princípio da chamada de método e mecanismo de transferência de parâmetro

  • Ao chamar um método por meio de uma variável, o mecanismo de chamada é o mesmo de uma função

  • A diferença é que quando a variável chama o método, a própria variável também será passada para o método como um parâmetro (se a variável for um tipo de valor, então o valor é copiado, se a variável for um tipo de referência, então o endereço é copiado)

Notas e detalhes do método

  • O tipo de estrutura é um tipo de valor. Na chamada do método, é cumprido o mecanismo de transferência do tipo de valor, que é o método de transferência de cópia de valor

  • Se o programador deseja modificar o valor da variável de estrutura no método, ele pode ser tratado pelo ponteiro de estrutura

  • Os métodos em Golang agem no tipo de dados especificado (ou seja: vincular ao tipo de dados especificado), então os tipos personalizados podem ter métodos, não apenas struct, como int, float32, etc. podem ter métodos

  • As regras para controlar o escopo de acesso dos métodos são iguais às das funções. A primeira letra do nome do método é minúscula e só pode ser acessada neste pacote.A primeira letra do método está maiúscula e pode ser acessada neste pacote e em outros pacotes.

  • Se um tipo implementa o método String (), então fimt.PrintIn chamará String () desta variável para saída por padrão

Cópia de valor e cópia de endereço em tipo de encadernação

  • Independentemente do formulário de chamada, a decisão real é a cópia do valor ou a cópia do endereço, dependendo do tipo ao qual o método está vinculado.

  • Se for um tipo de valor de soma, como (p Person), é uma cópia de valor, e se for um tipo de ponteiro, como (p * Person), é uma cópia de endereço.

  • A cópia do endereço pode modificar os atributos no tipo de ligação

03 Programação orientada a objetos

degrau

  • Declare (defina) a estrutura, determine o nome da estrutura

  • Escreva os campos da estrutura

  • Método de escrita da estrutura

Especifique valores de campo ao criar variáveis ​​de estrutura

var stu1 = Stu {"小 明", 19} var stu3 = Stu { 
    Nome: "jack", 
    Idade: 20, 
} var stu5 * stu = & stu {"小王", 29} var stu7 = & stu { 
    Nome: "小Lee ", 
    Idade: 49, 
}

04 Modo de Fábrica

A estrutura de Golang não tem construtor e o padrão de fábrica geralmente pode ser usado para resolver esse problema.

A primeira letra S do Aluno da estrutura é maiúscula. Se quisermos criar uma instância do Aluno em outros pacotes (como o pacote principal) e importar o pacote do modelo, podemos criar diretamente as variáveis ​​(instâncias) do Estrutura do aluno. Mas aí vem o problema: se a primeira letra for minúscula, como digite estrutura de aluno, não funcionará. Como fazer? Modelo de fábrica para resolver.

Use o padrão de fábrica para criar instâncias de estrutura (variáveis) entre pacotes

digite student struct { 
Name stringscore float64) 


fune Newstudent (n string, s float64) * student {return & student { 
    Name: n, 
    Score: s, 
}

05 Idéias de programação orientada a objetos

resumo

Quando definimos uma estrutura antes, na verdade extraímos os atributos comuns (campos) e comportamentos (métodos) de uma classe de coisas para formar um modelo físico (estrutura). Este método de estudar um problema é chamado de abstração.

Encapsulamento

Golang ainda tem os recursos de herança, encapsulamento e polimorfismo da programação orientada a objetos, mas a maneira como é implementada é diferente de outras linguagens OOP.

O encapsulamento consiste em encapsular os campos abstraídos e as operações nos campos.Os dados são protegidos internamente, e outros pacotes do programa só podem operar nos campos por meio de operações (métodos) autorizadas.

Compreensão e benefícios do encapsulamento

  • Ocultar detalhes de implementação

  • Os dados podem ser verificados para garantir a segurança e razoabilidade (Idade)

Como refletir o encapsulamento

  • Encapsular os atributos na estrutura

  • Por meio do método, o pacote realiza o encapsulamento

Etapas de realização de encapsulamento

  • Em minúsculas a primeira letra da estrutura e campo (atributo) (não pode ser exportado, outros pacotes não podem ser usados, semelhante ao privado)

  • Fornece uma função de modo de fábrica para o pacote onde a estrutura está localizada, com a primeira letra maiúscula. Semelhante a um construtor

  • Fornece um método Set com letras maiúsculas iniciais (semelhante ao público em outras línguas) para julgar e atribuir atributos

  • Fornece um método Get com letras maiúsculas iniciais (semelhante ao público em outras línguas) para obter atributos

Nota especial:

No desenvolvimento do Golang, não há ênfase especial no encapsulamento. Isso não é como o Java. O próprio Golang simplifica os recursos orientados a objetos.

type person struct { 
    Name string 
    age int} func NewPerson (name string) * person {return & person { 
        Name: name, 
    } 
} func (p * person) setAge (age int) {if age> 0 && age <150 { 
        p. age = age 
    } else { 
        fmt.Print1n ("年龄 范围 不 正确 ..") 
    } 
} func (p * person) GetAge () int {return p.age 
}

herdar

A herança pode resolver a reutilização de código e tornar nossa programação mais próxima do pensamento humano.

Quando várias estruturas têm as mesmas propriedades (campos) e métodos, a estrutura pode ser abstraída dessas estruturas e essas mesmas propriedades e métodos podem ser definidos na estrutura.

Sintaxe básica de estruturas anônimas aninhadas

tipo 
    Estrutura de mercadorias { Nome stringPrice int} tipo Estrutura de livro { 
    string Escritor de 
    mercadorias         }

Discussão aprofundada sobre herança

  • A estrutura pode usar todos os campos e métodos da estrutura anônima aninhada, ou seja, podem ser usados ​​os campos e métodos com a primeira letra maiúscula ou minúscula.

  • O acesso ao campo da estrutura anônima pode ser simplificado.

bAName = "tom" bAage = 19b.A.Sayok () 
bAhello () 


b.Name = "smith" b.age = 20b.sayok () 
b.hello ()
  • Quando a estrutura e a estrutura anônima têm os mesmos campos ou métodos, o compilador usa o princípio do acesso mais próximo. Se você deseja acessar os campos e métodos da estrutura anônima, pode distingui-los pelo nome da estrutura anônima

bAage = 19
  • A estrutura incorpora duas (ou mais) estruturas anônimas. Por exemplo, duas estruturas anônimas têm os mesmos campos e métodos (ao mesmo tempo, a própria estrutura não tem campos e métodos com o mesmo nome). Ao acessar, você deve explicitamente especifique o nome da estrutura anônima, caso contrário, compile um erro.

  • Se uma estrutura está aninhada com uma estrutura nomeada, este modo é uma combinação.Se for uma relação de combinação, então ao acessar os campos ou métodos da estrutura combinada, você deve trazer o nome da estrutura.

tipo D struct i 
    aA     
}
  • Depois que a estrutura anônima é aninhada, você também pode especificar diretamente o valor de cada campo da estrutura anônima ao criar uma variável de estrutura (instância)

type Goods struct { 
    Name string 
    Price float64} tipo Brand struct { 
    Name string 
    Address string} tipo TV struct { 
    Goods 
    Brand 
} type TV2 struct { 
    * Goods 
    * Brand 
} 

tv: = TV {Goods {"电视 001", 900.99}, Brand {"Haier", "Shandong"},} 
tv2: = TV { 
    Bens { 
        Preço: 88,99, 
        Nome: "电视 ee2" 
    }, 
    Marca { 
        Nome: "Sharp", 
        Endereço: "Beijing", 
    }, 
} 


tv3: = TV2 {& Goodsf {"TV03", 7000.99} e Marca {"Skyworth", "Henan"}} 
tv4: = TV2 { 
    &Produtos { 
        Nome: "TV 4", 
        Preço: 9eee.99,
    }
    & Marca { 
        Nome: "Changhong", 
        Endereço: "Sichuan", 
    }, 
}

Herança múltipla

Se uma estrutura for aninhada com várias estruturas anônimas, a estrutura pode acessar diretamente os campos e métodos da estrutura anônima aninhada, realizando assim a herança múltipla.

Para garantir a simplicidade do código, é recomendado evitar o uso de herança múltipla, tanto quanto possível

interface

O polimorfismo em Golang é refletido principalmente por meio de interfaces

O tipo de interface pode definir um conjunto de métodos, mas eles não precisam ser implementados. E a interface não pode conter nenhuma variável. Quando um determinado tipo personalizado deve ser usado, esses métodos são escritos (implementados) de acordo com a situação específica.

tipo interface Usb { 
    
    Iniciar () 
    Parar () 
}
  • Todos os métodos da interface não possuem corpo de método, ou seja, os métodos da interface são métodos que não são implementados. A interface incorpora a ideia de polimorfismo e alta coesão e baixo acoplamento do design do programa.

  • A interface em Golang não precisa ser implementada explicitamente. Contanto que uma variável contenha todos os métodos no tipo de interface, essa variável implementa a interface. Portanto, não existe uma palavra-chave como implementar em Golang

Notas e detalhes

  • A própria interface não pode criar uma instância, mas pode apontar para uma variável (instância) de um tipo personalizado que implementa a interface

  • Todos os métodos da interface não possuem corpo de método, ou seja, são todos métodos que não são implementados.

  • No Golang, um tipo personalizado precisa implementar todos os métodos de uma interface. Dizemos que esse tipo personalizado implementa a interface.

  • Um tipo personalizado só pode atribuir uma instância (variável) do tipo personalizado ao tipo de interface se implementar uma determinada interface

  • Contanto que seja um tipo de dados customizado, você pode implementar uma interface, não apenas um tipo de estrutura.

  • Um tipo personalizado pode implementar várias interfaces

  • Não pode haver nenhuma variável na interface do Golang

  • Uma interface (como a interface A) pode herdar várias outras interfaces (como as interfaces B e C.) Neste momento, se você deseja implementar a interface A, também deve implementar todos os métodos das interfaces B e C.

  • O tipo de interface é um ponteiro (tipo de referência) por padrão. Se for usado sem inicializar a interface, a saída será nil

  • A interface vazia interface} não possui métodos, então todos os tipos implementam a interface vazia, ou seja, podemos atribuir qualquer variável à interface vazia.

A diferença entre herança e interface

  • Quando a estrutura A herda a estrutura B, a estrutura A herda automaticamente os campos e métodos da estrutura B e pode ser usada diretamente

  • Quando a estrutura A precisa expandir suas funções e não quer destruir a relação de herança, pode-se implementar uma interface, portanto, podemos pensar que a implementação da interface é um complemento ao mecanismo de herança.

A implementação de uma interface pode ser vista como um suplemento à herança

Interface e herança resolvem problemas diferentes

  • O valor da herança é principalmente para resolver a capacidade de reutilização e manutenção do código.

  • O valor da interface reside principalmente em: projetar, projetar várias especificações (métodos) e permitir que outros tipos personalizados implementem esses métodos.

  • Interface é mais flexível do que herança

  • As interfaces são mais flexíveis do que a herança,

    • Herança é para satisfazer a relação é-um

    • A interface só precisa satisfazer o relacionamento semelhante a um

  • A interface alcança o desacoplamento de código até certo ponto

Polimorfismo

Variáveis ​​(instâncias) têm muitas formas. A terceira grande característica da orientação a objetos, na linguagem Go, o polimorfismo é obtido por meio de interfaces. Diferentes implementações podem ser chamadas de acordo com uma interface unificada. Neste momento, a variável de interface assume uma forma diferente.

  • Parâmetro polimórfico

  • Matriz polimórfica

Asserção de tipo

Asserção de tipo, porque a interface é um tipo geral, você não conhece o tipo específico, se você deseja converter para um tipo específico, você precisa usar a asserção de tipo

interface var x {} var b2 float32 = 1,1x = b2     
        
y: = x. (float32) 
fmt.Printf ("O tipo de y é o valor da lâmpada =% v", y, y)

Ao fazer uma afirmação de tipo, se o tipo não corresponder, ele reportará pânico, portanto, ao fazer uma afirmação de tipo, certifique-se de que a interface vazia original aponta para o tipo declarado.

interface var x {} var b2 float32 = 2,1 x = b2if y, ok: = x. (float32); ok { 
    fmt.Println ("converter com sucesso") 
    fmt.Printf ("O tipo de y é% T e o valor é =% v ", y, y) 
} else { 
    fmt.Print1n (" convert fai1 ") 
} 
fmt.Print1n (" Continuar a execução ... ")

 

 

Acho que você gosta

Origin blog.csdn.net/ThomasYC/article/details/115214890
Recomendado
Clasificación