add: x-tba structs

This commit is contained in:
Inanc Gumus
2019-04-10 21:00:05 +03:00
parent d686fdd749
commit 2cd646b092
12 changed files with 405 additions and 0 deletions

View File

@ -0,0 +1,65 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import "fmt"
func main() {
/*
USING VARIABLES
*/
// var (
// name, lastname string
// age int
// )
//
// name, lastname = "Pablo", "Picasso"
// age = 95
//
// name2, lastname2 := "Sigmund", "Freud"
// age2 := 83
//
// fmt.Println("Picasso:", name, lastname, age)
// fmt.Println("Freud :", name2, lastname2, age2)
/*
USING STRUCT VARIABLES
*/
// // declare a struct variable
// var picasso struct {
// name, lastname string
// age int
// }
// create a new struct type
type person struct {
name, lastname string
age int
}
// short-declare struct variable without field names
// you cannot omit values when you initialize without field names
picasso := person{
name: "Pablo",
lastname: "Picasso",
age: 95,
}
// short-declare struct variable with field names
// omitted fields will be zeroed
freud := person{
name: "Sigmund",
lastname: "Freud",
age: 83,
}
fmt.Printf("Picasso: %#v\n\n", picasso)
fmt.Printf("Freud : %#v\n\n", freud)
}

View File

@ -0,0 +1,53 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import "fmt"
func main() {
// create a new struct type
type person struct {
name, lastname string
age int
}
picasso := person{"Pablo", "Picasso", 95}
freud := person{name: "Sigmund", lastname: "Freud", age: 83}
// picasso.age++
// picasso.name = "Master"
master := picasso
// var master person
// master.name = picasso.name
// master.lastname = picasso.lastname
// master.age = picasso.age
master = freud
master.name = "Master"
master.age++
for _, p := range []person{picasso, freud, master} {
if p == picasso {
// if p.name == picasso.name &&
// p.lastname == picasso.lastname &&
// p.age == picasso.age {
// p is a copy
p.name = "Raphael"
fmt.Printf("%s's age is %d\n", p.name, p.age)
}
}
// Picasso is still the same
fmt.Printf("\n%s's age is %d\n", picasso.name, picasso.age)
// type team struct{ scores []int }
// _ = team{} == team{}
}

20
x-tba/structs/TODO.md Normal file
View File

@ -0,0 +1,20 @@
[x] what?
[x] why?
[x] struct type
[x] struct literal
[x] anonymous structs
[x] named structs
[x] struct fields
[x] compare and assign
[x] printing
[ ] embedding
**LATER:**
[ ] exporting struct and fields
[ ] funcs: constructor pattern
[ ] using anonymous structs when testing
[ ] pointers:
[ ] struct tags {json encode/decode} - project?
[ ] structs and pointers - later
[ ] padding and memory layout - later
[ ] empty struct (in channels section)

View File

@ -0,0 +1,19 @@
package main
import "fmt"
func main() {
type book struct {
name, isbn string
}
kafka := book{"Kafka's Revenge", "S-001"}
golden := book{"Stay Golden", "S-002"}
books := make(map[book]int, 2)
books[kafka] = 100
books[golden] = 50
fmt.Printf("%s sold %d times\n", kafka.name, books[kafka])
fmt.Printf("%s sold %d times\n", golden.name, books[golden])
}

View File

@ -0,0 +1,47 @@
package main
import (
"encoding/json"
"io/ioutil"
"github.com/inancgumus/learngo/x-tba/structs/xxx-json/wizards"
)
func main() {
wizards := []wizards.Wizard{
{Name: "Albert", Lastname: "Einstein", Nick: "emc2"},
{Name: "Isaac", Lastname: "Newton", Nick: "apple"},
{Name: "Stephen", Lastname: "Hawking", Nick: "blackhole"},
{Name: "Marie", Lastname: "Curie", Nick: "radium"},
{Name: "Charles", Lastname: "Darwin", Nick: "fittest"},
}
bytes, err := json.Marshal(wizards)
if err != nil {
panic(err)
}
ioutil.WriteFile("wizards.json", bytes, 0644)
//
// PREVIOUSLY
//
// names := [...][3]string{
// {"First Name", "Last Name", "Nickname"},
// {"Albert", "Einstein", "emc2"},
// {"Isaac", "Newton", "apple"},
// {"Stephen", "Hawking", "blackhole"},
// {"Marie", "Curie", "radium"},
// {"Charles", "Darwin", "fittest"},
// }
// for i := range names {
// n := names[i]
// fmt.Printf("%-15s %-15s %-15s\n", n[0], n[1], n[2])
// if i == 0 {
// fmt.Println(strings.Repeat("=", 50))
// }
// }
}

View File

@ -0,0 +1 @@
[{"Name":"Albert","nick":"emc2"},{"Name":"Isaac","nick":"apple"},{"Name":"Stephen","nick":"blackhole"},{"Name":"Marie","nick":"radium"},{"Name":"Charles","nick":"fittest"}]

View File

@ -0,0 +1,29 @@
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"strings"
"github.com/inancgumus/learngo/x-tba/structs/xxx-json/wizards"
)
func main() {
file, err := ioutil.ReadFile("../marshal/wizards.json")
if err != nil {
panic(err)
}
wizards := make([]wizards.Wizard, 10)
if json.Unmarshal(file, &wizards) != nil {
panic(err)
}
fmt.Printf("%-15s %-15s\n%s",
"Name", "Nick", strings.Repeat("=", 25))
for _, w := range wizards {
fmt.Printf("%-15s %-15s\n", w.Name, w.Nick)
}
}

View File

@ -0,0 +1,9 @@
package wizards
// Wizard is one of the greatest of people
type Wizard struct {
// name won't be marshalled (should be exported)
Name string `json:name`
Lastname string `json:"-"`
Nick string `json:"nick"`
}

View File

@ -0,0 +1,8 @@
learngoprogramming.com 10
learngoprogramming.com 5
learngoprogramming.com 10
learngoprogramming.com 20
golang.org 4
golang.org 6
golang.org 5
golang.org 10

View File

@ -0,0 +1,64 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
var (
// use a comparable struct for the keys
visits = make(map[string]int)
domains []string
dupDomains = make(map[string]bool)
line int
)
in := bufio.NewScanner(os.Stdin)
for in.Scan() {
line++
fields := strings.Fields(in.Text())
if len(fields) != 2 {
fmt.Printf("Wrong input: %v\n", fields)
return
}
domain, svisit := fields[0], fields[1]
dvisit, err := strconv.Atoi(svisit)
if err != nil {
fmt.Printf("Wrong input: %q (line #%d)\n", svisit, line)
return
}
visits[domain] += dvisit
// only add the domain once
if !dupDomains[domain] {
domains = append(domains, domain)
dupDomains[domain] = true
}
}
// print the summary grouped by domain
var total int
for _, d := range domains {
v := visits[d]
fmt.Printf("%-25s -> %d\n", d, v)
total += v
}
fmt.Printf("\n%-25s -> %d\n", "TOTAL", total)
}

View File

@ -0,0 +1,8 @@
learngoprogramming.com turkey 10
learngoprogramming.com turkey 5
learngoprogramming.com usa 10
learngoprogramming.com usa 20fds
golang.org germany 4
golang.org germany 6
golang.org italy 5
golang.org italy 10

View File

@ -0,0 +1,82 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
type visit struct {
domain string
country string
}
var (
// use a comparable struct for the keys
visits = make(map[visit]int)
domains, countries []string
dupDomains = make(map[string]bool)
dupCountries = make(map[string]bool)
line int
)
in := bufio.NewScanner(os.Stdin)
for in.Scan() {
line++
fields := strings.Fields(in.Text())
if len(fields) != 3 {
fmt.Printf("Wrong input: %v\n", fields)
return
}
v := visit{
domain: fields[0],
country: fields[1],
}
// increase the visit counts per domain + country
fhits := fields[2]
hits, err := strconv.Atoi(fhits)
if err != nil {
fmt.Printf("Wrong input: %q (line #%d)\n", fhits, line)
return
}
visits[v] += hits
// only add the domain once
if !dupDomains[v.domain] {
domains = append(domains, v.domain)
dupDomains[v.domain] = true
}
// only add the country once
if !dupCountries[v.country] {
countries = append(countries, v.country)
dupCountries[v.country] = true
}
}
// print the summary grouped by domain
for _, d := range domains {
fmt.Println(d)
for _, c := range countries {
v := visit{domain: d, country: c}
fmt.Printf("\t%s %d\n", c, visits[v])
}
}
}