Golang_정리하기_2

[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
      26
      type 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
        19
        type 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
      10
      func 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
      16
      func 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를 순회하며 필요치 않은 값은 “_” 를 이용해 무시할 수 있다.

#

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×