구조체
- 이름이 지정된 필드가 포함된 타입
type Circle struct {
x float64
y float64
r float64
}
or type Circle struct { x, y, z float64 } |
초기화
var c Circle -> 기본적으로 0으로 설정된 지역 Circle 변수가 생성된다. c := new(Circle) -> 모든 필드에 대한 메모리가 할당되고, 각 필드는 0 값으로 설정된 후 포인터가 반환된다. 각 필드에 값을 할당하고 싶은 경우, c := Circle{x: 0, y: 0, r: 5} or c := Circle{0, 0, 5} |
필드
- 필드 접근 방법
위에 예시를 활용하면,
fmt.Println(c.x, c.y, c.r)
c.x = 10
c.y = 5
|
- circleArea 함수가 Circle 사용
func circleArea(c Circle) float64 {
return math.Pi * c.r * c.r
}
|
구조체 필드는 보통 has-a 관계를 나타내며, 포함 타입을 가진다.
인터페이스
- 메서드 집합은 어떤 타입에서 인터페이스를 구현하기 위해 반드시 포함하고 있어야 할 메서드의 목록에 해당된다.
- 인터페이스 타입을 함수의 인자로 사용할 수 있다.
type Shape interface {
area() float64
}
func totalArea(shapes ...Shape) float64 {
var area float64
for _, s := range shapes {
area += s.area()
}
return area
}
fmt.Println(totalArea(&c, &r)) |
-인터페이스는 필드로도 사용할 수 있다.
type MultiShape struct {
shapes []Shape
}
func (m *MultiShape) area() float64 {
var area float64
for _, s := range m.shapes {
area += s.area()
}
return area
}
|
포인터
- 인자를 받는 함수를 호출할 때, 해당 인자는 함수로 복사된다.
func zero(x int) {
x = 0
}
func main() {
x := 5
zero(x)
fmt.Println(x) // x는 여전히 5
}
|
- 원본 x 변수를 변경하지 않을 경우,
func zero(xPtr *int) {
*xPtr = 0
}
func main() {
x := 5
zero(&x)
fmt.Println(x) // x는 0
}
|
- *(애스터리스크) : 저장된 값의 타입으로 나타낸다. 포인터 변수를 역참조하는 데도 사용된다.
- & 연산자 : 변수의 구조를 구할 때 사용한다.
- new 내장 함수 : 인자로 타입을 하나 받아 해당 타입의 값에 맞는 충분한 메모리를 할당한 후 그것에 대한 포인터를 반환한다.
func one(xPtr *int) {
*xPtr = 1
}
func main() {
xPtr := new(int)
one(xPtr)
fmt.Println(*xPtr) // x는 1
}
|
- new는 garbage collection을 지원하는 언어인 Go의 특성상, new로 생성한 것을 아무것도 가리키는 것이 없으면 메모리가 자동으로 정리된다는 특징이 있어 new로 생성한 것을 나중에 삭제할 때는 주의해야 된다.
배열
- 길이가 고정된, 번호가 매겨진 단일 타입 원소의 나열
package main
import "fmt"
func main() {
var x [5]int
x[4] = 100
fmt.Println(x)
}
|
int 타입으로 구성된 배열이며, 총 5개이다.
결과는 [ 0 0 0 0 100]
x[4] = 100
-> 인덱스 5번째를 100으로 설정한다.
슬라이스
- 배열의 일부이며, 인덱스를 통해 접근할 수 있고, 길이가 있다.
슬라이스 생성을 위해서는 make 함수 사용
x := make([]float64, 5)
-> 길이가 5인 float64 배열과 관련된 슬라이스가 만들어진다.
슬라이스를 사용할 때, append와 copy라는 내장 함수를 사용할 수 있다.
func main() {
slice1 := []int{1,2,3}
slice2 := append(slice1, 4, 5)
fmt.Println(slice1, slice2)
}
|
func main() {
slice1 := []int{1,2,3}
slice2 := make([]int, 2)
copy(slice2, slice1)
fmt.Println(slice1, slice2)
}
|
맵
- 순서 없는 키-값 쌍의 집합으로, 연관 배열 또는 해시 테이블, 딕셔너리로 알려져 있다.
- 연관 키를 통해 값을 찾는데 사용된다.
- 값이 고정된 경우, 고정된 값을 통해 키 네임을 변경할 수도 있다.(나는 그런 경우의 작업도 해봤기 때문에..)
x := make(map[string]int)
x["key"] = 10
fmt.Println(x["key"])
|
x := make(map[int]int)
x[1] = 10
fmt.Println(x[1])
|
'DevOps > GoLang' 카테고리의 다른 글
Go AES-256 암호화 (1) | 2023.01.10 |
---|---|
Go UUID/GUID generator (0) | 2023.01.10 |
Go 반복문 & 제어문 (0) | 2023.01.08 |
Go 변수 & 상수 (1) | 2023.01.02 |
Go 데이터 타입 (0) | 2023.01.02 |
댓글