치춘짱베리굿나이스

[Go] 01 패키지와 변수 함수 본문

기타공부/Go를 향한 여행

[Go] 01 패키지와 변수 함수

치춘 2021. 9. 19. 12:08

패키지

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	fmt.Println("치춘이가 좋아하는 랜덤게임 : ", rand.Intn(10))
}

  • 이전과 같이 math/rand 패키지를 불러와서 Intn 모듈을 사용
    • 패키지명은 경로의 맨 뒤에 있는 단어로 결정됨 (math/rand의 패키지명은 rand) 
  • 단 현재 난수를 생성할 때 환경 내에서 시드를 상수로 사용하므로, 각 환경마다 같은 수만 나오게 된다
    • 이것은 난수 생성 시드에 다른 값 (예를 들면 Time을 이용한 값 등) 을 넣어줌으로써 해결 가능

Import

package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Printf("제곱근 2: %g\n", math.Sqrt(2))
}​

  • Import 시에 패키지명을 괄호로 묶어서 여러 패키지를 한번에 불러올 수 있다
  • printf로 포맷 출력을 할 수 있다 (C처럼)

Export되는 이름

package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Pi)
}​

  • 패키지에서 외부로 값을 내보내기 위해서는 패키지명이 대문자로 시작해야 한다
  • math.pi라 쓰면 안됨!

함수

package main

import "fmt"

func add(x int, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(21, 21))
}​

  • C와 다르게 함수 매개변수의 자료형이 변수명 뒤로 간다
  • 함수의 자료형도 함수의 이름과 매개변수 뒤로 가는 것을 볼 수 있다 (왤까요,,,)
  • 그 외 사용방법 자체는 C와 크게 다르지 않다

이어서 Function

package main

import "fmt"

func add(x, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(42, 13))
}​

  • 매개변수들의 자료형이 같을 경우엔 마지막 매개변수만 적어줘도 된다

복수개의 결과

package main

import "fmt"

func swap(x, y string) (string, string) {
	return y, x
}

func main() {
	a, b := swap("hello", "world")
	fmt.Println(a, b)
}​

  • C에서는 반환값이 단 한개 뿐이었는데 Go는 복수의 결과값을 반환할 수 있다 (와~~~~~~ :catclap:)
  • 대입도 콤마로 간단하게 여러 개 반환값을 한 번에 대입할 수 있다
    • a, b := swap("hello", "world")

이름이 주어진 (기명의) 반환 값

package main

import "fmt"

func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}

func main() {
	fmt.Println(split(17))
}​

  • 반환값에 이름을 붙일 수 있다 (x, y int)
    • 마지막에 return만 해 줘도 해당 변수 (x, y) 가 자동으로 반환된다
  • 함수명 (매개변수) (반환값)

변수

package main

import "fmt"

var c, python, java bool

func main() {
	var i int
	fmt.Println(i, c, python, java)
}

  • 변수 선언은 var 뒤에 변수명, 그리고 자료형
  • 함수 매개변수처럼 같은 자료형인 변수들은 마지막 변수에만 자료형을 붙여줘도 상관없다
  • 패키지에도 변수가 존재할 수 있고, 함수 내부에도 변수가 존재할 수 있다 (전역, 지역)

변수 초기화

package main

import "fmt"

var i, j int = 1, 2

func main() {
	var c, python, java = true, false, "no!"
	fmt.Println(i, j, c, python, java)
}

  • 변수가 초기값을 가지고 있을 경우 자료형 명시를 해주지 않아도 된다
  • c랑 파이썬 자바 왤케싫어함ㅋㅋ

짧은 변수 선언

package main

import "fmt"

func main() {
	var i, j int = 1, 2
	k := 3
	c, python, java := true, false, "no!"

	fmt.Println(i, j, k, c, python, java)
}

  • 함수 내부에서는 간단하게 변수를 선언할 수 있다 (:= 사용)
  • 함수 밖 (패키지 전역공간) 에서는 모든 선언이 키워드로 시작해야 하므로 사용 불가능 (var 사용해야 한다)

기본 자료형

package main

import (
	"fmt"
	"math/cmplx"
)

var (
	ToBe   bool       = false
	MaxInt uint64     = 1<<64 - 1
	z      complex128 = cmplx.Sqrt(-5 + 12i)
)

func main() {
	fmt.Printf("Type: %T Value: %v\n", ToBe, ToBe)
	fmt.Printf("Type: %T Value: %v\n", MaxInt, MaxInt)
	fmt.Printf("Type: %T Value: %v\n", z, z)
}
더보기

bool

 

string

 

int int8 int16 int32 int64

uint uint8 uint16 uint32 uint64 uintptr

 

byte // uint8의 별칭

 

rune // int32의 별칭

// 유니코드에서 code point를 의미합니다.

 

float32 float64

 

complex64 complex128

  • int8, int16, int32... 등은 굳이 정수 길이를 제한해야 하는 경우가 아니라면 int를 씁시당
  • 명시적인 초기값이 주어지지 않은 변수는 zero value로 초기화된다
    • int는 0, bool은 false, 문자열은 "" (빈 문자열)

Type 변환

 

package main

import (
	"fmt"
	"math"
)

func main() {
	var x, y int = 3, 4
	var f float64 = math.Sqrt(float64(x*x + y*y))
	var z uint = uint(f)
	fmt.Println(x, y, z)
}

  • 타입명(변수) 를 통해 형변환을 시켜줄 수 있다
  • Go에서는 명시적 형변환이 필요함을 기억합시다

Inference Type

package main

import "fmt"

func main() {
	v := "chichoon zzang" // change me!
	fmt.Printf("v is of type %T\n", v)
}

package main

import "fmt"

func main() {
	v := 424242 // change me!
	fmt.Printf("v is of type %T\n", v)
}

  • := 또는 var을 통해 명시적으로 자료형을 지정하지 않은 채로 변수를 선언하고 초기화하면, 해당 변수의 자료형은 초기화한 값에 의해 결정된다
    • float나 complex의 경우, 값의 정밀도에 따라 결정된다
더보기

i := 42           // int
f := 3.142        // float64
g := 0.867 + 0.5i // complex128


상수

package main

import "fmt"

const Pi = 3.14

func main() {
	const World = "世界"
	fmt.Println("Hello", World)
	fmt.Println("Happy", Pi, "Day")

	const Truth = true
	fmt.Println("Go rules?", Truth)
}

  • 상수는 const를 붙여서 선언한다 (var 아님)
    • 약간 자바스크립트 냄새가 나는군
  • 상수는 := 를 사용할 수 없다

숫자형 상수

package main

import "fmt"

const (
	// Create a huge number by shifting a 1 bit left 100 places.
	// In other words, the binary number that is 1 followed by 100 zeroes.
	Big = 1 << 100
	// Shift it right again 99 places, so we end up with 1<<1, or 2.
	Small = Big >> 99
)

func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
	return x * 0.1
}

func main() {
	fmt.Println(needInt(Small))
	fmt.Println(needFloat(Small))
	fmt.Println(needFloat(Big))
}

  • 자료형이 정해지지 않은 상수는 어디에서 사용하냐에 따라 서로 다른 자료형을 취한다
  • needFloat 함수에 넣으면 두 상수 Big과 Small 모두 Float형으로 사용되지만, needInt 함수에 넣으면 Big은 오버플로우 오류가 발생한다

 

'기타공부 > Go를 향한 여행' 카테고리의 다른 글

[Go] 03 더 많은 타입들  (0) 2021.09.23
[Go] 02 흐름제어 구문  (0) 2021.09.19
[Go] 00 환영합니다  (3) 2021.09.18
Comments