기타

go언어 따라해보기(2) - 문자열, Swap, 구조체, 포인터, 가비지 콜렉터

카멜레온개발자 2021. 12. 7. 00:37

* UTF8 문자열 한글자씩 출력하기

 

더보기
    s := "Hello 월드"

	s2 := []rune(s)
	for i := 0; i < len(s2); i++ {
		fmt.Print(string(s2[i], ","))
	}

결과

H,e,l,l,o, ,월,드,

 

* 배열 역순으로 놓기

더보기
arr := [5]int{1, 2, 3, 4, 5}

	for i := 0; i < len(arr)/2; i++ {
		arr[i], arr[4-i] = arr[4-i], arr[i]
	}

	fmt.Println(arr)

* swap (a와 b를 바꾸기)

더보기
a := 1
	b := 2

	a, b = b, a

	fmt.Print("a : ", a, ", b : ", b)

 

* 구조체 선언 및 할당

더보기
package main

import "fmt"

//구조체 선언
type Person struct {
	name string
	age  int
}

//구조체 멤버 함수
func (p Person) PrintName() {
	fmt.Print(p.name)
}

func main() {
	//초기화
	var p Person
	p1 := Person{"Name1", 15}
	p2 := Person{name: "Name2", age: 11}
	p3 := Person{name: "Name3"}
	p4 := Person{}

	fmt.Println(p, p1, p2, p3, p4)

	//멤버 변수 할당
	p.name = "new Name"
	p.age = 100

	fmt.Println(p)

	//멤버 함수 실행
	p.PrintName()
}

* 포인터 타입으로 선언

var p* Person

p := *Person{"Name", 20}

 

 

* 구조체를 멤버로 가지는 구조체

  - 일반함수와 멤버함수의 호출방법

더보기
package main

import "fmt"

//구조체 선언
type Student struct {
	name  string
	class int

	sungjuk Sungjuk
}

type Sungjuk struct {
	name  string
	grade string
}

//멤버함수
func (s Student) ViewSungjuk() {
	fmt.Println(s.sungjuk)
}

//멤버함수 : 입력
func (s Student) InputSungjuk(name string, grade string) {
	s.sungjuk.name = name
	s.sungjuk.grade = grade
}

//일반함수
func ViewSungjuk(s Student) {
	fmt.Println(s.sungjuk)
}

func main() {
	var s Student
	s.name = "철수"
	s.class = 1

	s.sungjuk.name = "수학"
	s.sungjuk.grade = "C"

	//멤버함수 호출
	s.ViewSungjuk()
	//일반함수 호출
	ViewSungjuk(s)

	//아래와 깉이 입력해도 바뀌지 않는다
	s.InputSungjuk("과학", "A")
	s.ViewSungjuk()
}

 

* 그런데, golang에서 구조체의 멤버함수라 해도 Call by Value 방식으로 구조체 인스턴스를 복사하는 방식이라 그냥 대입해서는 값이 바뀌지 않는다

 

* 포인터 기본 사용법

더보기
func main() {
	var a int
	var b int
	var p *int

	p = &a
	a = 3
	b = 2

	fmt.Println("a : ", a)
	fmt.Println("p : ", p)
	fmt.Println("*p : ", *p)

	p = &b

	fmt.Println("a : ", b)
	fmt.Println("p : ", p)
	fmt.Println("*p : ", *p)

}

 

* 포인터의 성질

더보기
func main() {
	var a int
	var b int

	a = 1
	b = 1

	IncVal(a)
	IncPointer(&b)

	fmt.Println("a : ", a)
	fmt.Println("b : ", b)
}

func IncVal(x int) {
	x++
}

func IncPointer(x *int) {
	*x = *x + 1
}

 

 

* 가비지 콜렉터 또는 허상참조(dangling reference) : C/C++과 달리 참조 값이 0이 될때까지 메모리 해제가 안된다

더보기
package main

import "fmt"

func main() {
	var p *int
	p = f1()
	fmt.Printf("P : %d", *p)
}

func f1() *int {
	a := 3
	return &a
}