본문 바로가기
golang

[golang] Golang pointer, routine 포인터, 고루틴

by weq155 2023. 11. 13.
반응형

 

go에는 포인터 기능이 있다. (라이브러리 등에서 되게 많이 활용함)

그래서 간단 실습 해본 내용을 공유하고자 한다.

 

Pointer

우선 go에는 module을 담는 mod라는 파일이 dir내에 존재해야 외부 모듈을 사용 할 수 있다.

mod 파일을 설치하려면 터미널을 go 패키지의 루트 디렉토리에 위치하고

go mod init {패키지명} 명령을 터미널에 입력해주면 된다.

아래 코드는 os 모듈을 이용해 포인터 주소를 출력하는 예시이다.

 

// 가장 기초적인 포인터 구조
func main() {
	a := "string"
	testPointer(&a)
	fmt.Printf("a: %v\\n", &a)
}

func testPointer(a *string) {
	*a = "another string"
}



//execute
go run main.go

//module init
go mod init

args = os.Args

// fomat %s = string , %v = value
func main() {
	args := os.Args

	if len(args) < 2 {
		fmt.Printf("Usage: ./go <argument>\n")
		os.Exit(1)
	}
	fmt.Printf("helloWorld\n os.Args: %v\n Argument: %v", args, args[1:])
}
//
go run main.go argment1
helloWorld
Arguments: [/var/folders/r3/rfgbsvp17tj5dh4v2jnvssvm0000gn/T/go-build3274469574/b001/exe/main argment1]
//
go run main.go         
Usage: ./go <argument>
exit status 1

 

GoRoutine

Scale in & out 과 같은 동시작업이 많은 인프라 툴에서 Go언어가 유행하게된 이유 중 고루틴을 빼놓을 수 없다.

(쿠버네티스가 go로 만들어진것도 있음)

Go루틴은 Go 런타임이 관리하는 논리적 쓰레드이다.

실행 방법은 간단한데 함수 앞에 go를 붙여주면 된다.

go루틴은 비동기적으로 함수루틴을 실행하여 여러코드를 동시에 실행하는데 사용된다.

Go루틴은 쓰레드와 1대1로 대응되지않고 훨씬 가볍게 실행되어 수천 수만개의 동시작업이 이루어진다.

 

// goroutine을 적용하지 않았을 때
func main() {
	fmt.Printf("one\n")
    testFunction()
	fmt.Printf("two\n")
}

func testFunction() {
	fmt.Printf("three\n")
}

// 출력값
❯ go run *.go
one
three
two

////////////////////////////

// goroutine을 적용했을 때, goroutine이 실행되기 전에 코드가 종료
func main() {
	fmt.Printf("one\n")
	go testFunction()
	fmt.Printf("two\n")
}

func testFunction() {
	fmt.Printf("three\n")
}
// 출력값
❯ go run *.go
one
two


/////////////////////

// timesleep을 부여해서 go routine이 실행될 시간을 부여
func main() {
	fmt.Printf("one\n")
	go testFunction()
	fmt.Printf("two\n")
	time.Sleep(1 * time.Second)
}

func testFunction() {
	fmt.Printf("three\n")
}

// 실행결과
❯ go run *.go
one
two
three

///////////////////////////////////////

//goroutine에 timeSleep을 주면 함수가 끝나고 코드가 종료
func main() {
	fmt.Printf("one\n")
	c := make(chan bool)
	go testFunction(c)
	fmt.Printf("two\n")
	areWeFinished := <-c
	fmt.Printf("areWeFinished: %v\n", areWeFinished)
}


func testFunction(c chan bool) {
	for i := 0; i < 5; i++ {
		fmt.Printf("checking...\n")
		time.Sleep(1 * time.Second)
	}
	c <- true
}
// 출력값
❯ go run *.go
one
two
checking...
checking...
checking...
checking...
checking...
areWeFinished: true

 

반응형

 

반응형