95 lines
2.1 KiB
Go
95 lines
2.1 KiB
Go
// 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"
|
|
|
|
// #1b: create the song struct type
|
|
type song struct {
|
|
title, artist string
|
|
}
|
|
|
|
// #5: structs can contain other structs
|
|
type playlist struct {
|
|
genre string
|
|
|
|
// songTitles []string
|
|
// songArtist []string
|
|
|
|
// #6: include a slice of song structs
|
|
songs []song
|
|
}
|
|
|
|
func main() {
|
|
// #1: create two struct values with the same type
|
|
song1 := song{title: "wonderwall", artist: "oasis"}
|
|
song2 := song{title: "super sonic", artist: "oasis"}
|
|
|
|
fmt.Printf("song1: %+v\nsong2: %+v\n", song1, song2)
|
|
|
|
// #4: structs are copied
|
|
// song1 = song2
|
|
|
|
// #3: structs can be compared
|
|
if song1 == song2 {
|
|
// #2: struct comparison works like this
|
|
// if song1.title == song2.title &&
|
|
// song1.artist == song2.artist {
|
|
fmt.Println("songs are equal.")
|
|
} else {
|
|
fmt.Println("songs are not equal.")
|
|
}
|
|
|
|
// #8
|
|
songs := []song{
|
|
// #7b: you don't have to type the element types
|
|
{title: "wonderwall", artist: "oasis"},
|
|
{title: "radioactive", artist: "imagine dragons"},
|
|
}
|
|
|
|
// #7: a struct can include another struct
|
|
rock := playlist{
|
|
genre: "indie rock",
|
|
songs: songs,
|
|
}
|
|
|
|
// #9: you can't compare struct values that contains incomparable fields
|
|
// you need to compare them manually
|
|
|
|
// clone := rock
|
|
// if rock.songs == clone {
|
|
// }
|
|
// if songs == songs {
|
|
|
|
// #11: song is a clone, it cannot change the original struct value
|
|
song := rock.songs[0]
|
|
song.title = "live forever"
|
|
|
|
// #11c: directly set the original one
|
|
rock.songs[0].title = "live forever"
|
|
|
|
// #11b
|
|
fmt.Printf("\n%+v\n%+v\n", song, rock.songs[0])
|
|
|
|
// #10: printing
|
|
fmt.Printf("\n%-20s %20s\n", "TITLE", "ARTIST")
|
|
for _, s := range rock.songs {
|
|
// s := rock.songs[i]
|
|
|
|
// #12b: s is a copy inside because struct values are copied
|
|
s.title = "destroy"
|
|
fmt.Printf("%-20s %20s\n", s.title, s.artist)
|
|
}
|
|
|
|
// #12
|
|
fmt.Printf("\n%-20s %20s\n", "TITLE", "ARTIST")
|
|
for _, s := range rock.songs {
|
|
fmt.Printf("%-20s %20s\n", s.title, s.artist)
|
|
}
|
|
}
|