Documentation ¶
Index ¶
- func ArraysAndSlices()
- func AtomicAndMutexRaceCondition()
- func Channels()
- func ContextAndGoRoutines()
- func Errors()
- func Generics()
- func GoRoutines()
- func GoRoutinesWithSyncWaitGroup()
- func GoTools()
- func ImplementInterfaceSorting()
- func InterfaceAndAssertions()
- func Interfaces()
- func JsonParsing()
- func Logs()
- func Maps()
- func Pointers()
- func ReadersAndWriters()
- func Sqrt(n float64) (float64, error)
- func StructsAndMethods()
- type Animal
- type Book
- type BookByRate
- type Car
- type Cat
- type CustomErrorWithStruct
- type Developer
- type Dog
- type Example
- type Fruit
- type MultipleConstraits
- type MultipleConstraitsWithCoreType
- type MyConstraint
- type MyString
- type MyType
- type MyTypeString
- type Person
- type Someone
- type SomeoneOrCarConstraint
- type SqrtError
- type User
- type UserWithTags
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ArraysAndSlices ¶
func ArraysAndSlices()
func AtomicAndMutexRaceCondition ¶
func AtomicAndMutexRaceCondition()
func ContextAndGoRoutines ¶
func ContextAndGoRoutines()
func GoRoutines ¶
func GoRoutines()
func GoRoutinesWithSyncWaitGroup ¶
func GoRoutinesWithSyncWaitGroup()
func ImplementInterfaceSorting ¶
func ImplementInterfaceSorting()
func InterfaceAndAssertions ¶
func InterfaceAndAssertions()
func Interfaces ¶
func Interfaces()
func JsonParsing ¶
func JsonParsing()
func ReadersAndWriters ¶
func ReadersAndWriters()
func StructsAndMethods ¶
func StructsAndMethods()
Types ¶
type BookByRate ¶
type BookByRate []Book
func (BookByRate) Len ¶
func (f BookByRate) Len() int
func (BookByRate) Less ¶
func (f BookByRate) Less(i, j int) bool
func (BookByRate) Swap ¶
func (f BookByRate) Swap(i, j int)
type Cat ¶
type Cat struct {
Name string
}
- Caso uma variavel instancie uma struct com metodo com receiver por ponteiro que implementa uma interface, e chame um método da interface, o método da struct será chamado mesmo a variavel sendo nil. Isso acontece porque o Go chama o método diretamente da struct, e não da variavel. Só irá acontecer um panic se for chamado uma propriedade da struct que não foi inicializada.
type CustomErrorWithStruct ¶
type CustomErrorWithStruct struct {
// contains filtered or unexported fields
}
func (CustomErrorWithStruct) Error ¶
func (e CustomErrorWithStruct) Error() string
type Developer ¶
- Embbeded structs são structs que são usadas como campos de outras structs, bem semelhante a herança, mas os campos são de fato copiados para a struct que os contém.
type MultipleConstraits ¶
- Dentro dos generics, é possível utilizar multiplos constraints usando uma interface que possua os contraints desejados, nesse caso, os contraints ou tipos são separados por pipe (|) semelhante ao Typescript. Há duas formas de definir esses constraints multiplos: MyFunc[T interface { Foo | Bar }](): aceita a criação da interface inline MyFunc[T MyConstraint](): aceita uma interface já criada com as opções dentro -> MyConstraint interface { Foo | Bar }
type MultipleConstraitsWithCoreType ¶
type MultipleConstraitsWithCoreType interface { // Se não for passado o `~` antes do tipo customizado, o compilador irá acusar erro // Pois nesse caso, o tipo `MyTypeStrin` não é um dos tipos definidos no constraint, mas internamento, lá no `core type` ele é uma string que é um dos tipos definidos no constraint int | ~string | constraints.Float }
type MyConstraint ¶
type MyConstraint interface {
Foo()
}
- Há vários tipos de constraints que podem ser usados any: aceita qualquer tipo int, string, float64, etc: aceita apenas o tipo específico interface: aceita qualquer tipo que implemente a interface comparable: aceita qualquer tipo que possa ser comparado, ou seja, que implemente os métodos == e !=
type MyString ¶
type MyString string
func (MyString) SayHello ¶
func (MyString) SayHello()
- Para criar métodos é necessário usar um `receiver` que é um parâmetro especial que é passado para o método. É declarada como uma função normal, mas com um parâmetro antes do nome da função. Exemplo: func (<Struct>) <func_name>() {}
O receiver pode ser um ponteiro ou um valor. Com ele é possível acessar os campos da struct. Quando a struct é passada como valor, uma cópia é feita e qualquer alteração não será refletida no original. Quando a struct é passada como ponteiro, a referência é passada e qualquer alteração será refletida no original. Quando não é necessário usar o valor da struct, pode omitir a variavel do receiver, passando apenas o tipo.
Por convenção, o nome do receiver é a primeira letra do tipo da struct em minúsculo. Por convenção, quando um método altera o estado da struct, o receiver deve ser um ponteiro. Por consequência, todos os métodos da struct devem ser ponteiros.
Não é possível adicionar metodos de structs fora do pacote que a struct foi definida.
type MyType ¶
type MyType struct{}
Agora a função fooWithMyConstraint aceita o MyType porque ele implementa a interface MyConstraint
type MyTypeString ¶
type MyTypeString string
- Quando se tem multiplos constraints, o funcionamento é estrito, ou seja, o tipo passado como argumento deve ser um dos tipos definidos no constraint. Caso queira aceitar um tipo customizado mas que o `core type` dele esteja dentro das opções dos generics, é necessário usar o `~` antes do tipo informado
- inclusive, o Go tem um pacote com essas constraints que são usadas internamente, com o objetivo de facilitar a criação de generics com `core types` `golang.org/x/exp/constraints`
type Person ¶
- Structs são tipos de dados que podem ser usados para agrupar diferentes tipos de dados. Uma struct é um tipo e pode ser criada com o `type` e `struct` keywords. Structs não são classes, mas são bem parecidas por terem propriedades e métodos.
func (Person) GetIDWithPrefix ¶
type SomeoneOrCarConstraint ¶
Uma maneira de driblar isso e pelo menos conseguir acessar os métodos, é passar uma constraint já construida com o método em comum nas structs
type SqrtError ¶
type SqrtError struct{}
- Erros podem ser personalizados através da interface error Essa interface de Error tem apenas a função Error() string, então, qualquer struct que implemente essa função pode ser usada como um erro personalizado
type User ¶
- Erros previnem chamadas de ponteiros nulos Tratando esse tipo de erro antes de chamar métodos em ponteiros
func (User) GetFullName ¶
type UserWithTags ¶
- Struct Tags são strings que podem ser adicionadas aos campos de uma struct para fornecer metadados sobre o campo.
- Struct Tags são usadas para serializar e deserializar structs. Qualquer pacote que aceite structs serializadas e deserializadas pode usar essas tags. Inclusive é possível criar pacotes personalizados que aceitam essas tags. Exemplo: `json:"name"`, `xml:"name"`, `yaml:"name"`, `bson:"name"`, `db:"name"`, `validate:"name"`, etc.
Source Files ¶
- 01.pointers.go
- 02.2.arrays-and-slices.go
- 03.maps.go
- 04.structs-and-methods.go
- 05.1.interface.go
- 05.2.interface-and-assertions.go
- 05.3.json.go
- 05.4.implement-sorting.go
- 06.errors.go
- 07.readers-and-writes.go
- 08.generics.go
- 09.0.context-and-goroutines.go
- 09.1.goroutines.go
- 09.2.sync-waitgroup.go
- 09.3.atomic-and-Mutex.go
- 09.4.channels.go
- 10.tools.go
- 11.logger.go