var slice = []int{1,2,3}
slice2 := append(slice,4)var array = [...]int{1,2,3} // 길이가 3인 배열
var slice = []int{1,2,3} // 슬라이스var map1 map[string]int = make(map[string]int)var map2 = make(map[string]int) // 자료형 생략
map3 := make(map[string]int) // 리터럴 형여러 변수의 타입을 담아 하나의 형태로 만들 때 사용, 데이터 필드의 모음, 고정된 고유 필드 집합을 구성하여 선언
type Persons struct {
	Name string
	Age int
	Pnum string
}var pers Persons
pers.Name = "codz"
pers.Age = 23
pers.Pnum = "01098765432"new를 이용해 구조체를 할당받아 각 요소별 초기화하는 과정 및 형식
// 방법 1
p1 := new(Persons)
// 방법 2
var p2 = new(Persons)
// 방법 3
var p3 = &Persons{"test", 17, "01045673210"}
// 방법 4 - 배열 형식
p4 := []Persons{
		Persons{
			Name: "p1",
			Age:  10,
			Pnum: "9876",
		},
		Persons{
			Name: "p2",
			Age:  9,
			Pnum: "8765",
		},
	}
인터페이스는 메서드의 집합, 메서드의 원형(prototype, 메서드 자체를 구현하지는 않음)들의 집합
type Persons  interface {
    Student() int
    Player() string
}함수 매개변수, 리턴 값, 구조체 필드등으로 사용가능 → 어떤 타입으로도 변환이 가능하다
모든 타입을 나타내기 위해 빈 인터페이스를 사용한다.
package main
import "fmt"
func main() {
	var a interface{}
	printInterface(a)
	a = 7.5
	printInterface(a)
	a = "Golange"
	printInterface(a)
	a = true
	printInterface(a)
	a = nil
	printInterface(a)
}
func printInterface(v interface{}) {
	fmt.Printf("Type : (%T) ", v) // 원본타입
	fmt.Println("입력된 값 : ", v)
}
interface.(type)을 이용하면 형변환 하여 사용할 수 있다.
실행(Runtime) 시에는 인터페이스에 할당한 변수를 실제 타입으로 변환 후 사용해야 하는 경우
인터페이스.(타입) 형태로 사용
package main
import (
	"fmt"
	"reflect"
)
func main() {
	var a interface{} = 15
	b := a
	c := a.(int)
	fmt.Println("a : ", a)
	fmt.Println("a Type : ", reflect.TypeOf(a))
	fmt.Println("b : ", b)
	fmt.Println("b Type : ", reflect.TypeOf(b))
	fmt.Println("c : ", c)
	fmt.Println("c Type : ", reflect.TypeOf(c))
	fmt.Println()
	// 저장된 실제 타입 검사
	if v, ok := a.(int); ok {
		fmt.Println("반환된 값은? : ", v, "반환 여부 : ", ok)
	}
}
switch 타입 검사를 할 수 있다.
어떤 타입이든 받을 수 있기 때문에 아래 예제처럼 타입별로 결과를 다르게 처리할 수 있다.
package main
import (
	"fmt"
)
func checkType(arg interface{}) {
	switch arg.(type) {
	case bool:
		fmt.Println("bool type : ", arg)
	case int, int8, int16, int32, int64:
		fmt.Println("int type : ", arg)
	case float64:
		fmt.Println("float type : ", arg)
	case string:
		fmt.Println("string type :", arg)
	case nil:
		fmt.Println("nil type :", arg)
	default:
		fmt.Println(arg)
	}
}
func main() {
	checkType(false)
	checkType(1)
	checkType(11.111)
	checkType(nil)
	checkType("Hello!")
}
new() : 메모리를 할당하는 내장 함수
특정 데이터 타입에 대해서는 초기화를 해주는 작업이 필요하다 이때 사용하는 함수가 make() 함수