치춘짱베리굿나이스
[Go] 01 패키지와 변수 함수 본문
패키지
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