상세 컨텐츠

본문 제목

[Nomad Coin] Tour of Go - #3.7 Structs with Pointers

Go/Blockchain

by Gopythor 2022. 7. 11. 03:27

본문

728x90
반응형

#3.7 Structs with Pointers

package person

type person struct {
    name string
    age int
}
  • person 폴더에 person.go를 만든다.
  • 그리고 nico를 main function에서 만든다
  • person struct가 소문자이면 export가 불가능하다. 대문자로 고쳐야 한다.
  • variable, function, type 등 대문자로 시작하면 그 말은 export가 되었다는 뜻이고 다른 패키지에서 사용가능.
package person

type Person struct {
    name string
    age int
}
  • nodejs에서는 export default를 해야하지만 go에서는 대문자로만 하면 자동적으로 export 된다.
package main

import "person"

func main() {
    nico := person.Person{}
    fmt.Println(nico)	// { 0}
}
  • export되지 않은 field에 assign을 할 수 없다. 보다시피 name 과 age는 export 되지 않았다.
  • receiver funcion을 사용해서 해결할 수 있다.
  • name은 빈 string, age는 0을 가졌다.
  • name 과 age 필드를 다른 사람과 공유하기를 거절하였으므로, 할당도 하지 못한다.
  • 그러면 어떻게 main funcion이 이름 또는 age를 설정하게 할 수 있을까?
  • receiver funcion은 funcion 안에서 instance에 접근한다.
package person

import "fmt"

type Person struct {
    name string
    age int
}

func (p Person) SetDetails(name string, age int) {
    p.name = name
    p.age = age
    fmt.Println("SeeDetails' nico:", p)
}
  • 함수의 이름은 SetDetails이고, 대문자로 시작해야 export 가능하다.
  • name 과 age를 받을 것이다.
  • function을 부르는 person을 받아서 p.name= name, p.age = age
package main

import "person"

func main() {
    nico := person.Person{"nico", 12}
    fmt.Println("Main's 'nico'", nico)
}
  • main funcion에 있는 nico의 값.
func (p Person) SetDetails(name string, age int) {
    p.name = name
    p.age = age
    fmt.Println("SeeDetails' nico:", p)
}
  • 여기있는 p는 person을 부르는 variable을 뜻한다.
SeeDetails's nico: {nico 12}
Main's nico' { 0}
  • 비어있는 nico를 main에 생성했고, SetDetils를 호출했다.
  • 작동은 한다. 왜냐하면 SeeDetails에서 nico는 name과 age를 가진다.
  • 그러나 main function에서 nico를 출력하면 작동하지 않는다.
  • 왜냐하면 nico의 복사본이 전달되서 출력되었기 때문이다.
  • SetDetails가 실제로 nico 자체를 바꾸지 못했다.
package person

import "fmt"

type Person struct {
    name string
    age int
}

func (p *Person) SetDetails(name string, age int) {
    p.name = name
    p.age = age
    fmt.Println("SeeDetails' nico:", p)
}
  • Person에 *를 넣으면 Go는 nico 값을 복사하는 것이 아니라 main function의 structure 를 넘겨 받는다.
SeeDetails' nico: &{nico 12}
Main's 'nico' {nico 12}
  • *의 유무로 SetDetails의 복사본을 수정 또는 nico 수정 여부를 정한다.
  • struct가 그렇게 크지 않고 값을 전혀 수정하지 않을 때는 복사본이면 충분하다.
func (p Person) Name() string {
    return p.name
}
  • 단지 값만을 return 하기 때문에 포인터가 필요없다.
  • SeeDetails가 pointer receiver가 없다면 struct는 수정되지 않는다.

강의 출처 : 노마드코더(https://nomadcoders.co)

728x90
반응형

관련글 더보기

댓글 영역