기타
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
}