[ go ] go 퀴즈 오답노트


  • Go의 Zero Value
  • 변수를 선언하면서 초기값을 지정하지 않으면, Go는 Zero Value를 기본적으로 할당한다. 즉, 숫자형에는 0, bool 타입에는 false, 그리고 string 형에는 "" (빈문자열)을 할당한다




  • $GOPATH가 C:\GoApp;C:\GoSrc 으로 설정되어 있고, C:\GoSrc\src\mylib\mylib.go 안에 mylib 라는 사용자 정의 패키지를 작성하였다. C:\GoSrc\src\test\main.go 메인패지키 안에서 mylib 패키지를 import 하였을 때, 실행시 mylib 패키지를 import하기 위해 찾는 경로가 아닌 것은?

    • import 검색 경로는 /src/ 로부터의 상대적 위치이다 (http://golang.site/go/article/15-Go-%ED%8C%A8%ED%82%A4%EC%A7%80)

      1. C:\Go\src\mylib

      2. C:\GoApp\src\mylib

      3. C:\GoSrc\src\test\mylib

      4. C:\GoSrc\src\mylib

        중에 3번을 찾지 않는다.




  • func main() {
        x := 5
        y := &x
        z := x ** y
       
        println(z)	//25
    }
    
    • x ** y 는 실제 x * (*y) 와 동일하다

    • Go에서는 포인터연산자라는 것이 있는데 & 혹은 * 을 사용하여 해당 변수의 주소를 얻어내거나 이를 반대로 Dereference 할 때 사용한다

    • 포인터 : 메모리 주소에 접근

      • func main(){
        	a := 2
        	b := &a
        	fmt.Println(a, b)	//2 0xc000096008
        	fmt.Println(*b)	//2
        }
               
        이런식으로 변수앞에 &를 붙이면 변수의 주소값에 접근하는 것이다. 그래서 a의 데이터값이 뭐든간에 a의 주소값만 가지고 올 수 있다
        변수앞에 *를 붙이면 변수가 접근한 주소값이 가지고 있는 값을 보기 위한 것이다.
        
    • Bitwise 연산자

      • Bitwise 연산자는 비트단위 연산을 위해 사용되는데, 바이너리 AND, OR, XOR와 바이너리 쉬프트 연산자가 있다.
    • 할당연산자

      • 할당연산자는 값을 할당하는 = 연산자 외에 사칙연산, 비트연산을 축약한 +=, &=, «= 같은 연산자들도 있다.




  • func main() {
        a := [3]int{1, 2, 3}
        b := a
        b[1] = 100
           
        fmt.Println(a)	//[1 2 3]
    }
    
    • Go에서 배열을 다른 변수에 할당하면, 배열 요소값 전체가 Copy 되어 별도의 배열이 된다. 이 말은 b에 a가 할당되었으니 b와 a는 완전 다른 별도의 배열이 되었다는 뜻이고 b에 어떠한 수정을 한대도 a와는 상관이 없다는 말이다.




  • package main
       
    import (
        "fmt"
        "reflect"
    )
       
    func main() {
        a := [3]int{}
        b := [5]int{}
        c := reflect.TypeOf(a) == reflect.TypeOf(b)
        fmt.Println(c)	//false
    }
    
    • Go에서 배열의 배열크기는 Type을 구성하는 한 요소이다. 즉, [5]int와 [10]int는 다른 Type이다.




  • func main() {
        hasValue := 1
       
        if hasValue {
            println("true")
        } else {
            println("false")
        }
    }
      
    //컴파일에러
    
    • Go는 1,0 과 같은 숫자를 if 조건식으로 사용할 수 없다.




  • package main
    func main() {
        msg := "Hello"
        say(&msg) 	//msg 변수의 주소를 표시
        println(msg)
    }
        
    func say(msg *string) {    //*string는 파라미터가 포인터임을 표시
        *msg = "Hi"	//주소에 데이타를 쓰기 위해서는 앞에 *를 붙인다
    }
    
    • Pass by reference로 전달되어 msg값이 타 함수에 의해 변경되었다.
    • Go에서 파라미터를 전달하는 방식은 크게 Pass By Value와 Pass By Reference로 나뉜다.




  • Go 언어의 함수에 대한 설명
    • Go 언어에서 함수는 일급함수(= 함수를 다른 변수와 동일하게 다루는 언어)이다
    • 함수는 다른 함수의 파라미터로 전달될 수 있다
    • 함수는 다른 함수의 리턴값으로 사용될 수 있다
    • 익명함수는 변수에 할당될 수 있으며, 함수를 할당한 변수는 타 함수의 파라미터로 전달될 수도 있다.




  • Go 언어의 배열(array)에 대한 설명

    • 배열은 Value 타입이다

      배열을 함수의 파라미터로 전달하면, 배열의 값들이 모두 복사되어 전달된다.

      배열의 크기는 Type의 일부분이다. 즉, [5]int와 [10]int는 다른 Type이다.

      배열은 다른 변수에 = 을 이용하여 할당하면, 배열의 모든 값이 복사된다.




  • s := []int{0, 1, 2, 3, 4, 5}
    s = s[2:5]    //마지막인덱스는 원하는 인덱스+1 을 사용하기 때문에 5는 실질적으로 4번인덱스를 가리킨다 
    s = s[1:]      
    fmt.Println(s)	//3,4
    
    • 슬라이스에 별도의 길이와 용량을 지정하지 않으면, 기본적으로 길이와 용량이 0 인 슬라이스를 만드는데, 이를 Nil Slice라 한다. (Nil은 Null과 같다)
    • 부분 슬라이스는 “슬라이스[처음인덱스:마지막인덱스]” 형식이다. 즉, 처음인덱스는 Inclusive 이며, 마지막인덱스는 Exclusive이다
    • 마지막까지 포함하기 위해서는 [원하는인덱스:]와 같이 쓸 수 있다




  • struct : Custom Data Type을 표현하는데 사용된다 (typescript의 interface와 유사). 필드들의 집합체
  • interface : 메서드들의 집합체















© 2018. by sora

Powered by sora