[Go tutorial] Go 정리하기 - 2
Go-tour 참조
구름edu 참조
구조체(Structs)
structs는 데이터들의 조합
type선언으로 이름을 지정할 수 있음
“객체이름 := 구조체이름{저장할값}”으로 입력해 선언과 동시에 초기화할 수 있다.
구조체에 속한 필드(데이터)는 dot(.)으로 접근
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26type person struct {
name string
age int
contact string
}
func main() {
var p1 = person{}
fmt.Println(p1)
p1.name = "kim"
p1.age = 25
p1.contact = "01000000000"
fmt.Println(p1)
p2 := person{"nam", 31, "01022220000"} // 필드 이름을 생력할 시 순서대로 저장함
fmt.Println(p2)
p3 := person{contact: "01011110000", name: "park", age: 23} // 필드 이름을 명시할 시 순서와 상관 없이 저장할 수 있음
fmt.Println(p3)
p3.name = "ryu" //필드에 저장된 값을 수정할 수 있음
fmt.Println(p3)
fmt.Println(p3.contact) //필드 값의 개별 접근도 가능함
}
포인터
포인터 연산은 불가능
포인터를 이용한 간접 접근은 실제 구조체에도 영향을 끼침
“&” 을 매개변수 앞에 붙여 pass by reference 를 통해 값이 저장된 주소에 직접 접근할 수 있음.
구조체 포인터를 생성하는 방법은 두 가지가 있다.
‘new(구조체이름)’ 을 사용하여 객체를 생성
구조체 이름 앞에 & 붙이기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19type Person struct {
Name string
}
func main() {
c := new(Person) // returns pointer
c.Name = "Catherine"
fmt.Println(c.Name) // prints: Catherine
d := *c
d.Name = "Daniel"
fmt.Println(d.Name) // prints: Daniel
i := &d
i.Name = "Ines"
fmt.Println(c.Name) // prints: Catherine
fmt.Println(d.Name) // prints: Ines
fmt.Println(i.Name) // prints: Ines
}
슬라이스(slice)
슬라이스는 참조 타입이다. 따라서, 슬라이스를 복사한다는 것은 같은 주소를 참조한다는 것이다. 복사한 슬라이스의 값을 바꾸면 참조하는 슬라이스의 해당 값도 바뀌게 된다.
슬라이스 선언
var a []int = []int{1,2,3,4} 와 같이 선언과 함께 초기화
make() 함수를 이용.
make(슬라이스 타입, 슬라이스 길이, 슬라이스 용량)
ex) s:=make([]int,3,3)
append() 함수를 통해 슬라이스에 데이터를 추가할 수 있다.
슬라이스에 슬라이스를 추가하기 위해서는 슬라이스 뒤에 “…”을 입력
1
2
3
4
5
6
7
8
9
10func main() {
sliceA := []int{1, 2, 3}
sliceB := []int{4, 5, 6}
sliceA = append(sliceA, sliceB...)
//sliceA = append(sliceA, 4, 5, 6)
fmt.Println(sliceA)
fmt.Println(sliceB)
}copy(붙여넣을 슬라이스, 복사할 슬라이스) 를 통해 한 슬라이스를 다른 슬라이스로 복사할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16func main() {
c := make([]int, 0, 3) //용량이 3이고 길이가0인 정수형 슬라이스 선언
c = append(c, 1, 2, 3, 4, 5, 6, 7)
fmt.Println(len(c), cap(c))
l := c[1:3] //인덱스 1요소부터 2요소까지 복사
fmt.Println(l)
l = c[2:] //인덱스 2요소부터 끝까지 복사
fmt.Println(l)
l[0] = 6
fmt.Println(c) //슬라이스 l의 값을 바꿨는데 c의 값도 바뀜
//값을 복사해온 것이 아니라 기존 슬라이스 주솟값을 참조
}위의 예제를 실행해보면 slice c의 값도 l 에 의해 바뀌는것을 확인할 수 있다. 왜냐하면, 슬라이스는 배열과 다르게 슬라이스 자체가 참조하고 있는 주소값을 같이 참조하기 때문이다.
슬라이스 순회(iterates)
슬라이스는 for 반복문에서 range를 통해 순회할 수 있다.
이때, index와 value를 순회하며 필요치 않은 값은 “_” 를 이용해 무시할 수 있다.