잠시만 기다려 주세요

     '대통령을 욕하는 것은 민주사회에서 주권을 가진 시민의 당연한 권리입니다. 대통령을 욕하는 것으로 주권자가 스트레스를 해소할 수 있다면 저는 기쁜 마음으로 들을 수 있습니다. - 노무현 -'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (27)  |  여러가지 팁 (1126)  |  추천 및 재미 (166)  |  자료실 (25)  |  
시사, 이슈, 칼럼, 평론, 비평 (1047)  |  끄적거림 (160)  |  문예 창작 (736)  |  바람 따라 (75)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    golang

golang - golang 구조체 struct 포인터 개념 정리....
이 름 : 바다아이   |   조회수 : 12995         짧은 주소 : https://www.bada-ie.com/su/?111591783505
golang 에서 구조체와 그 함수들에 대한 관계를 생각해 보면
쉽게 객체 생성시 그 구조체에 딸린 함수들도 따라간다고 보면 됩니다.
자바로 예를 들어 클래스 안에 각멤버변수들과 method 들이 있듯이
golang 은 구조체에 함수를 붙여넣는 형식입니다.
결국 클래스 형태가 되겠지요.. 그걸 포인터 변수에 넘기고 받고 하면서 사용을 합니다. 전형적인 golang 코딩 스타일 입니다.

그리고 함수 만들때 앞에 (변수 *구조체) 이렇게 괄호 안에 * 딸린 부분 보시면 *를 넣었을 때는 메모리 영역 구조체 값이 따라가고 
*를 빼면 복사 개념입니다. 저 변수가 메모리 주소가 될 수가 있고 단순히 복사된 새로운 것이 될 수 있습니다.
포인터 변수에 주소값을 넘길때는 넘길 변수 앞에 & 기호를 붙여 사용합니다.
특정 메모리 영역에 있는 값을 특정 구조체에 복사하여 넘길 때는 넘길 포인터 변수 앞에 *를 붙이면 됩니다. 
이래저래 복잡하게 설명 했는데 아래 세개 예제 보시면서 공부해 보세요...

이해를 하셔야 합니다. golang 에서 구조체, 함수, 포인터 개념은 정말 중요합니다. 
포인터 변수란... 메모리 주소다.... 
메모리 주소를 일반 변수로 스스로 착각하고 있는지 잘 생각하셔야 합니다.

fmt 로 콘솔에 찍어 봤을 때 &가 붙으면 주소, 아니면 값입니다.


예제1)

package main

import (
	"fmt"
)

type aa struct {
	a string
	b string
}

func bb() *aa {
	ii := aa{"ddd", "kkk"}
	return &ii
}

func (y *aa) cc() {
	y.a = y.a + y.b
}

func main() {
	c := bb()
	fmt.Println(c.a)

	c.cc()
	fmt.Println(c.a)

	// 주소가 아닌 값을 넘김...
	d := *c
	fmt.Println(d.a)

	// ppp 가 d.a 에 안 들어감...
	c.a = "ppp"
	fmt.Println(d.a)

	// 포인터 주소를 넘겼기에 e.a 에는 ppp 가 있음.
	e := c
	fmt.Println(e.a)
}

/* 결과
ddd
dddkkk
dddkkk
dddkkk
ppp
*/


예제2)

package main

import (
	"fmt"
)

type Vertex struct {
	X, Y, C float64
}

func (v Vertex) Abs() float64 {
	// 2를 넣어도 Abs2() 아래에 반영되지 않음.... 주소값을 가져온 게 아니라 구조체 복사개념
	v.C = 2
	return v.X*v.X + v.Y*v.Y
}

func (v *Vertex) Abs2() float64 {
	a := v.X*v.C + v.Y*v.C
	// 2를 넣으면 Abs3() 아래에 반영됨, 주소값을 가져온 개념
	v.C = 2
	return a
}

func (v Vertex) Abs3() float64 {

	return v.X*v.C + v.Y*v.C
}

func main() {
	v := Vertex{3, 4, 0}
	fmt.Println(v.Abs())
	fmt.Println(v.Abs2())
	fmt.Println(v.Abs3())
	fmt.Println(v.C)

	v2 := &Vertex{3, 4, 0}
	fmt.Println(v2.C)

	v3 := *v2
	v2.C = 1
	fmt.Println(v3.C)

	v4 := v2
	fmt.Println(v4.C)
}

// Vertex 와 &Vertex 의 결과는 현재는 크게 상관없습니다. 어차피 초기화 되니까요...
// 그러나 interface 나 v4 같이 사용시에는 상관이 있을 수 있습니다. 주소를 넘기는 개념과 복사하는 개념은 다르니까요...
// 대체적으로 단순 1회성 사용시에는  &를 사용하지 않는 것이 속도상으로 더 좋습니다. 같은 메모리 영역에 동시 접근은 느리니까요..

/* 결과
25
0
14
2
0
0
1
*/

예제3)

package main

import (
	"fmt"
)

type aa struct {
	a string
	b string
}

func main() {
	c := &aa{"a", "b"}
	fmt.Println(c)

	var d aa
	d = *c
	fmt.Println(d)

	var yy aa
	yy = *c
	fmt.Println(yy)

	c2 := aa{"c", "d"}
	fmt.Println(c2)

	var d2 *aa
	d2 = &c2
	fmt.Println(d2)

	var yy2 *aa
	yy2 = &c2
	fmt.Println(yy2)
}

/* 결과
&{a b}
{a b}
{a b}
{c d}
&{c d}
&{c d}
*/

| |





      1 page / 7 page
번 호 카테고리 제 목 이름 조회수
184 golang golang postgresql golang postgresql ..timezone .. 바다아이 1257
183 golang golang mariadb, mysql pooler proxysql ..!!! mariadb , .. 바다아이 1430
182 golang golnag ...  Go ... go get ... 바다아이 1348
181 golang golang postgresql + pgx + pgbouncer ... . pgbouncer , ... 바다아이 1464
180 golang golang ... 바다아이 2209
179 golang golang , ... 바다아이 5049
178 golang golang , map . 바다아이 4052
177 golang Golang (, , data ) , ... 바다아이 4959
176 golang golang sort ... 바다아이 5072
175 golang golang html.EscapeString html.UnescapeString input value ... 바다아이 4888
174 golang golang go.mod go.sum . GOPATH SRC not module, 1.16 . 바다아이 8718
173 golang go 1.16 ... is not in GOROOT.. GOPATH .... . 바다아이 10047
172 golang , String Formatting 바다아이 11179
171 golang rand.Intn , random, , . 바다아이 10761
170 golang golang ... 바다아이 14924
169 golang golang gopath, goroot .. golang 바다아이 11593
168 golang golang ... Force download file example 바다아이 13704
167 golang golang , , cpu, memory, disk 바다아이 14873
166 golang golang , ... GOOS, GOARCH 바다아이 12191
165 golang golang checkbox ... 바다아이 12288
164 golang golang , , http .... 바다아이 12080
163 golang golang nil , nil , nil ... 바다아이 11963
162 golang 2 golang, go , .... golang .... 바다아이 15267
161 golang golang postgresql, mysql, mariadb ... ` Grave () .. .. 바다아이 12593
160 golang golang postgresql mysql, mariadb scan , null .. 바다아이 12571
159 golang golang , iconv 바다아이 15422
158 golang golang quote escape, unquote 바다아이 12754
157 golang golang , http errorLog , , ... 바다아이 13232
156 golang golang interface , 바다아이 12421
현재글 golang golang struct .... 바다아이 12996
| |









Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 chrome 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Debian + GoLang + PostgreSQL + Mariadb + PgBouncer + ProxySQL]
서버위치 : San Jose Datacenter  실행시간 : 0.05429
to webmaster... gogo sea. gogo sea.