package main
import"fmt"type Vertex struct {
X int
Y int
}
funcmain() {
fmt.Println(Vertex{1,2})
}
구조체 리터럴(Struct Literals) : 필드와 값을 나열해서 구조체를 새로 할당하는 방법
import"fmt"type Vertex struct{
X, Y int
}
var {
p = Vertex{1, 2}
q = &Vertex{1, 2}
r = Vertex{X: 1}
s = Vertex{}
}
funcmain() {
fmt.Println(p, q, r, s)
}
result: {12} &{12} {10} {00}
포인터(Pointers)
Go에도 포인터가 있지만 포인터 연산은 불가능하다.
구조체 변수는 구조체 포인터를 이용해서 접근 할 수 있다.
포인터를 이용하는 간접 접근은 실제 구조체에도 영향을 미친다.
package main
import"fmt"
type Vertex struct {
X int
Y int
}
func main() {
p := Vertex{1, 2}
q := &p
q.X = 1e9
fmt.Println(p)
}
result: {10000000002}
new 함수
new(T) : T는 타입의 종류, 모든 필드가 0이 할당된 T 타입의 포인터를 반환한다.
var t *T = new(T) or t:= new(T)
# example
package main
import"fmt"type Vertex struct {
X, Y int
}
funcmain() {
v := new(Vertex)
fmt.Println(v)
v.X, v.Y = 11, 9
fmt.Println(v)
}
슬라이스(Slices)
슬라이스는 배열의 값을 가리키며 배열의 길이를 가지고 있다.
[ ] T 는 타입 T를 가지는 요소의 슬라이스(slice)이다.
슬라이스는 슬라이스 자르기(Slicing slices)도 지원 ex ) s[lo:hi] => lo 에서 hi-1의 요소를 포함하는 슬라이스
package main
import"fmt"funcmain() {
p := []int{2, 3, 5, 7, 11, 13}
fmt.Println("p ==", p)
for i := 0; i < len(p); i++ {
fmt.Println("p[%d] == %d\n",
i, p[i])
}
}
슬라이스 만들기
슬라이스는 make 함수로 만들 수 있다. 이렇게 생성된 슬라이스는 0을 할당한 배열을 생성하고, 그것을 참조한다.
package main
import"fmt"funcmain() {
a := make([] int, 5)
printSlice("a", a)
b := make([] int, 0, 5)
printSlice("b", b)
}
funcprintSlice(s stinrg, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n",
s, len(x), cap(x), x)
}
result :
a len=5cap=5 [00000]
b len=0cap=5 []
레인지(Range)
python의 enumerate와 유사, for 문에서 range를 통해 슬라이스나 맵을 순회할 수 있다.
package main
import"fmt"var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
funcmain(){
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
result:
2**0 = 12**1 = 22**2 = 42**3 = 82**4 = 162**5 = 322**6 = 642**7 = 128
_ 를 이용해서 인덱스(index)나 값(value)을 무시할 수 있으며, 값을 적지 않으면 인덱스만 표시된다.
연습 : 슬라이스
Pic 이라는 함수를 구현한다. 이 함수는 dy개 만큼의 길이를 가지는 슬라이스를 리턴해야 하는데, 각각의 요소들은 또한 dx개의 8비트 부호없는 8비트 정수 타입을 가지는 슬라이스이다.
package main
import"code.google.com/p/go-tour/pic"funcPic(dx, dy int) [][]uint8 {
a := make([]uint8, dx)
b := make([][]uint8, dy)
for i := range a {
a[i] = uint8(i)
}
for i := range b {
b[i] = a
}
return b
}
funcmain() {
pic.Show(Pic)
}