본문 바로가기
DevOps/GoLang

Go 구조체 & 포인터 & 슬라이스 & 맵

by SeleniumBindingProtein 2023. 1. 8.
728x90
반응형

구조체

- 이름이 지정된 필드가 포함된 타입

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])
728x90
반응형

'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

댓글