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 ... ")