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) | ||
|  | 	} | ||
|  | } |