1. 포인터

Low level programming language :  C언어와 같이 컴퓨터가 쉽게 이해하도록 프로그래밍하는 것. 실행 속도가 빠르지만 배우기 어렵다 유지보수가 힘들다 이런 언어들은 메모리 파트에 접근할 수 있다 그것이 바로 포인터!

 

예시1)

a=2

b=a        일 때 b는 a의 값을 복사해서 가져온다

a=10       후에 b와는 상관없이 a값에 10을 가져오면 a는 10이 된다

a와 b의 값은 각각 10,2

 

& : &뒤에 나오는 값이 가지는 메모리 주소를 알려주는 기능이다

예시2)

a=2

b=&a      b는 a의 주소 값을 가져온다

a=10       

a와 b의 값은 각각 10, a의 주소 값

 

* : *뒤에 나오는 주소가 가지는 값을 알려주는 기능이다 (씨쓰루)

예시 3)

a=2

b=&a

*b의 값은 2

*b=5일 때

a의 값은 얼마일까?

*b로도 a값을 바꿀 수 있기 때문에 답은 5이다

 

이렇게 포인터를 알아보았는데 포인터는 컴퓨터에서 복사가 아닌 바로가기의 느낌이다

 

복사는 용량 전체를 가져오지만 바로가기는 연결만 할 뿐 내용 전체를 담아오지는 않는다

 

두 개의 변수가 하나의 object로 서로 연결되어있기 때문에 빠르게 대응할 수 있다

b = a, a = 2 b = &a, a = 2
&a = a주소값

&b = b주소 값

&a = a주소값 &b = b주소값
a = a b = a a = a b = &a
*(&a) = 2 *(&b) = 2 *(&a) = 2 *(&b)! = 2
    *a = error *b = 2

b=&a인 경우에도 &b=b의 주소 값을 가진다 하지만 *(&b)는 2가 아니고 &a이다

2. Arrays and Slices

Array : Go에서 Array(배열)은 요소의 개수와 형태를 입력해주어야한다

 

ex)

  names := [5] string{"nico","lynn","dal","pavk"} //요소개수를 정했다면 그보다 많이 적을 수는 없다

  names[4]="hui"  //요소를 추가하는 방법

  names[5]="asd" //6번째 이름을 추가하는 것이므로 에러가 난다 

 

Slices : 하지만!! Slices는 제한이 없는 배열이다 융통성있는 배열

 

ex)

  names := [ ] string{"nico","lynn","dal","pavk"} //요소개수를 비움으로서 요소개수제한이 없다

  names = append(names, "hui") //slice에 요소를 추가하는 방법

※append는 slice를 수정해서 요소를 추가하는 것이 아닌 요소가 추가된 새로운 slice를 반환한다

  

3. Map

map : 파이썬의 dictionary와 비슷한 형태이다 key와 value형태를 가지고 있다

 

ex)

  pavk :=map[string]string{"name":"pavk","age":"25"}

//key와 value 형태를 string으로 지정했으면 숫자여도 "25"이렇게 써줘야한다

 

ex)map을 활용한 반복문

  pavk :=map[string]string{"name":"pavk","age":"25"}

  for key,value := range pavk{ //배웠던 반복문 처럼 쓰면 되는데 배열과 다르게 index를 반환하지않고 key를 반환한다

       반복할 내용

  }  

 

 

1. for 반복(loop) 문

go에서는 for문만을 사용한다

 

forEach나 for in 같은 경우는 사용할 필요가 없다고 한다

 

왜냐하면 range를 사용할 것이기 때문이다 

(1) range

range란? 각각의 배열 요소에 반복할 내용을 실행시킨다

 

형태 : for 변수 := range 범위가 될 어떤 것(배열, 슬라이스, 문자열){

                  반복할 내용

         }

 

예시) superAdd함수에 들어있는 인자(2,3,4,5,7,9)의 개수 6개만큼 numbers를 출력한다  ≒forEach( ) in javascript

func superAdd(numbers ...int) int{
	for number := range numbers{ //반복할 횟수는 numbers의 개수
		fmt.Println(number)	 //반복될 내용
    }
	return 1
}

func main(){
	superAdd(2,3,4,5,7,9)       //numbers의 개수는 6개
}

실행결과를 보면 

이렇게 나오게 되는데 배열 요소의 개수만큼 자동으로 index값을 받게 되어서라고 한다

array(배열)과 slice(슬라이스: 융통성 있는 배열?)에서 range반복문은 index값과 배열 안의 값을 생성한다(index먼저 생성)

 

index를 보기 싫다면 for의 변수 중 처음은 무시하고( _ 언더바 사용 ) 두 번째 것을 입력하면 된다

이렇게

func superAdd(numbers ...int) int{
	for _,number := range numbers{ 
		fmt.Println(number)	 
    }
	return 1
}

func main(){
	superAdd(2,3,4,5,7,9)       

(2) i 사용

C언어와 비슷하다

꼭 i만 써야 되는 것은 아니다(하지만 아마도 수는 안될 것이다)

형태: for i:=0; i <범위(대신 수 형태여야 함); i++{

            반복할 내용

       }

(3) 총합 구하기 예제

package main

import (
	"fmt"
)

func superAdd(numbers ...int) int {
	total := 0                   	//총합이 되어줄 친구 반복문 밖에 있어야함
	for _, number := range numbers {//index는 보기싫어서 _로 무시
		total = number + total		//total변수에 각각의 수를 더해주기
	}
	return total
}

func main() {
	result := superAdd(2, 3, 6, 7, 9, 10)
	fmt.Println(result)
}

//결과 37

요약

1. for만 사용(for in, forEach 없음)

2.range는 배열에선 index값을 먼저 생성한다

3.i 같은 변수로도 범위를 구할 수 있다

 

2. if ~ else, switch~case

1. if ~ else

1) 다른 언어들과 다르게 ( )이나 :이 필요 없다

2) VScode에서 제공하는 extention return값을 주면 else를 쓸 필요 없다

3) if문을 쓰는 도중에 변수를 생성할 수 있다(무엇을 위한 변수인지 알아보기 쉬움) 

	if koreanAge := age + 2; koreanAge < 18 { //(),:필요없이 조건 바로적음 //koreanAge := age + 2; if문을 쓰는 도중에 변수만들기
		return false
	} 
	return true //else{ return true} 였을텐데 return true만 적어도 실행가능 
	

else if 조건을 추가할 때 쓰임

if 조건{

 

} else if 조건{

 

} else {

 

}

2. switch/case

1) C나 javascript와 많이 비슷하다(파이썬은 switch를 사용하지 않음)

2) if~else와 마찬가지로 쓰는 도중에 변수를 생성할 수 있다

3) else if를 도배할 필요 없이 case로 짧게 짧게 쓸 수 있다

 

package main

import (
	"fmt"
)

func canIdrink(age int) bool {
	switch koreanAge= age+2; koreanAge { //switch문 도중 변수 선언 가능
	case age < 18:			//만약 if문을 썼다면 else if로 도배될 것을 case로 짧게 짧게
		return false
	case age ==18:
		return true
	}
	return false
}

func main() {
	result := canIdrink(18)
	fmt.Println(result)
}

 

1. main Package

패키지란?

Go언어가 코드의 모듈화, 코드의 재사용과 같은 기능을 제공하기위해 사용하는 것이다

 

이전에 만든main.go는 패키지라고 불리고 앞서 말했듯 컴파일러에게 특별하게 인식된다

 

컴파일러는 main.exe(실행파일)을 만든다

 

Go에서는 main package를 쓰고 있다는 것을 작성해주어야한다

또 main package는 main 함수를 필요로한다 Go 프로그램의 시작점이 되는 부분이기 때문이다(C의 느낌이 강하게 난다)

package main

func main() {
} 

프로그램을 실행시키는 방법도 특이하다 터미널(명령 프롬프트)에 파일 저장 후 go run main.go라 입력해야 한다

 

2. fmt Package and Import

fmt는 formatting을 위한 패키지이다 이때 중요한 것은 함수 첫 글자는 항상 대문자로 써야한다는 점이다

그렇지 않을경우 나타나지지 않는다

 

첫글자가 소문자일경우는 private한 함수이고 대문자일 경우는 export된 함수이기 때문이다(이건 Go에서 지정한 약속같다)

package main

import "fmt"

func main() {
fmt.Println("Hello world!") //Println의 P가 대문자이다 export!
}

※컨트롤키를 누른채 fmt를 클릭하게된다면 fmt 안의 내용을 알 수 있다  또 fmt를 사용하지 않게 되면 자동으로 import문이 사라진다 (VScode의 장점)

3. function(함수)

변수와 상수 variable(=var), constant(=const) 각각 '변할수 있음'과 '변할수 없음'

 

Go에서 변수를 선언하기위해서는 type도 알려주어야한다 ex) var name string = "pavk"

 

함수 안에서는 이것을 축약형으로 name :="pavk"라고 쓸 수 있다(type은 Go가 알아서 찾아준다고 한다ㅎㅎ)  

name := "nico" //축약형
var name string = "lynn" //원래(너무 김)

 

또한 Go는 만들어 놓고 쓰지 않는 것을 굉장히 싫어한다 쓰지않으면 에러를 발생시킨다

 

 

Go는 함수에서 반환값을 2개 이상 가질 수 있다 (<--이것이 아마 병행성의 이유이지 않을까?)

또한 println처럼 인자를 무제한으로 가지려면 ...type을 써주면  된다

func lenAndUpper(name string) (int, string) {
	return len(name), strings.ToUpper(name) //2개의 반환값을 반환함!!
}

func repeatMe(words ...string) { //'...'만 있다면 무제한 인자!!
	fmt.Println(words)
}

func main() {
	repeatMe("nico","lynn","dal","marl","flynn","pavk")//이렇게 많은 인자도 출력이 가능하다
}

naked return : 반환값을 return 뒤가 아니라 반환값의 type 앞에 적을 수 있다

defer : 반환을 한 후에 추가로 실행을 시킬 수 있다  

func lenAndUpper(name string) (lenght int, uppercase string) { //여기 type들 앞에서 변수처럼 만들어지고 반환값으로도 사용된다
	defer fmt.Println("I'm done") //반환하고 추가로 I'm done을 출력함
	lenght = len(name)
	uppercase = strings.ToUpper(name)
	return			//여기가 아니라
}

defer를 화인해보기위해서 출력을 해보았다

package main

import (
	"fmt"
	"strings"
)

func lenAndUpper(name string) (length int, uppercase string) {
	defer fmt.Println("I'm done")//2.두번째로 실행되어야한다
	length = len(name)
	uppercase = strings.ToUpper(name)
	fmt.Println(length, uppercase)  //1.먼저 실행되어야 defer가 실행되는것을 알 수 있다
	return
}

func main() {
	totalLength, up := lenAndUpper("nico")
	fmt.Println(totalLength, up)//3.세번째
}

 

실행결과!

 

예전부터 Go언어를 접해보고 싶었지만 영어 때문에 안 배우고 있었는데

 

슬랙에 올라온 한국어 패치가 되었다는 내용을 보자마자 달려갔다(올라온지는 꽤 됐었고 어제 봤음)

https://nomadcoders.now.sh <--노마드코더 슬랙

 

그래서 Go란 무엇이냐?

Go는 2009년 구글이 개발한 프로그래밍 언어로 가비지 컬렉션 기능이 있고, 병행성을 잘 지원하는 컴파일 언어라고 한다

 

(1) 가비지 컬렉션(쓰레기 수집?)? ==> 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요 없게 된 영역을 해제하는 기능이다.

 

(2) 병행성? ==> 컴퓨터 과학에서 여러 계산을 동시에 수행하는 시스템의 특성으로, 잠재적으로는 서로 상호 작용이 가능하다. 이와 상대적인 개념으로는 병렬성이 있다

 

(1)(2)를 합치면? 실행 속도가 빠르다!! 

 

니꼬쌤도 빠르다는 것을 빨리 보여주고 싶어서 앞서 우리가 했던 파이썬 스크래핑과 Go스크래핑을 비교하며 보여줬다

 

온라인 세팅은 파이썬 때와 마찬가지로 Repl.it을 사용할 수 있다

 

하지만 나는 니꼬쌤이 추천한 VScode(Visual Studio Code)와 Go를 설치하고 실행했다(오프라인)

VScode는 에디터 Go는 프로그래밍 언어이다

https://code.visualstudio.com/Download <--VScode는 여기서 윈도우, 맥, 리눅스 등 다양한 버전에 맞게 설치를 한다

https://golang.org/dl/<--Go는 여기서  윈도우, 맥, 리눅스 등 다양한 버전에 맞게 설치를 한다

 

Go를 설치할 때 주의할 점은 로컬 드라이브에 go폴더와 bin폴더를 만들어 주어야 한다 ex) C:\go\bin

 

go폴더는 GOPATH환경을 위해 꼭 필요하다고 한다 (자세한 내용은 Go를 다운로드하는 버튼을 클릭하면 나옴 영어로)

 

main.go는 go폴더 안의 src폴더 안의 github.com안의 자신의 닉네임 폴더 안의 learngo폴더에 저장해주면 좋다

ex) C:\go\src\github.com\pavk\learngo\main.go(없으면 생성해야 함)

 

main.go는 컴파일하기 위해서 꼭 필요한 패키지이다

 

공유, 오픈소스코드를 만들기 위함이라면 main.go를 만들면 안된다

 

나는 window10 사용자여서  VScode를 실행하여 새 파일을 생성고 저장을 통해 이름과 확장자를 main.go로 바꾸었다

 

그러면 VScode에서 Go를 사용하기 위해 업데이트를 하라고 막막막 뜨는데 그것을 다 하자는 대로 해주면 된다

 

이런 화면이 나왔다면 성공! 기본적인 세팅은 끝났다

 

+ Recent posts