GO언어

[Go] 패키지 기초, 데이터 타입

HHRR 2023. 1. 20. 09:45

패키지 기본⭐⭐⭐

package main

//선언 방법
import (
	"fmt"
	"os"
)

func main() {
	var name string
	fmt.Println("이름은?: ")
	fmt.Scanf("%s", &name)

	fmt.Fprintf(os.Stdout, "Hi! %s\n", name) //터미널에서 진행
	// cd, go run .\package1.go

}

 

- 패키지 : 코드 구조화(모듈) 및 재사용
- 응집도, 결합도
- Go : 패키지 단위의 독립적이고 작은 단위로 개발 -> 작은 패키지를 결합해서 프로그램을 작성 할 것을 권고
- 패키지 이름 = 디렉토리 이름
- 같은 패키지 내 -> 소스파일들은 디렉토리명을 패키지 명으로 사용한다.
- 네이밍 규칙 : 소문자  private 패키지 외부 접근 불가(내부만 가능), 대문자 : public 패키지 외부에서 접근 가능

- Go : main 패키지는 특별하게 인식 -> 컴파일러 공유 라이브러리x, 프로그램의 시작점 start point!

 


  • 내가 만든 라이브러리 이용
    • section4 / lib / lib.go 파일
// 라이브러리 접근제어(1)
package lib

import "fmt"

func init() {
	fmt.Println("lib Package > init start!")
}

//num 체크 (입력값 10보다 크면 true, 이외는 false)
func CheckNum(c int32) bool {
	return c > 10
}

- package lib 으로 생성후 num 체크 함수 작성

  • section4 / package2.go 파일
package main

//go path가 goproject로 지정
import (
	"fmt"
	checkUp "section4/lib" //우리가 만든 라이브러리
    _ "section4/lib2"
)

func main() {
	fmt.Println("10보다 큰 수? : ", lib.CheckNum(4)) //대문자여야 접근가능 public
}

- main에서 import로 내가 만든 라이브러리 불러와서 lib.CheckNum으로 함수 사용 가능

- checkUp "section4/lib" : Alias 별칭사용

- _ "section4/lib2" : 빈 식별자, 지금 사용하진 않지만 나중에 사용할 것이라는 뜻


 
  • 초기화
//go 초기화 함수(1)

package main

import (
	"fmt"
)

func init() {
	fmt.Println("Init Method Start!")
}

func main() {
	fmt.Println("Main Method Start!")
}

- init : 패키지 로드시에 가장 먼저 호출, 한 파일에 여러개 있어도됨
- 가장 먼저 초기화되는 작업 작성 시 유용하다

- import한 외부 패키지 사용시에 그 패키지에 있는 초기화나 작업 먼저 실행후 main으로 넘어옴 


데이터 타입

  • bool
// 데이터 타입 : Bool(1)
package main

import "fmt"

func main() {
	//예제1
	var b1 bool = true
	var b2 bool = false
	b3 := true
	fmt.Println("ex1 : ", b1)
	fmt.Println("ex2 : ", b2)
	fmt.Println("ex3 : ", b3)

	fmt.Println("ex4 : ", b3 == b3)
	fmt.Println("ex5 : ", b1 && b3)
	fmt.Println("ex6 : ", b1 || b2)
	fmt.Println("ex7 : ", !b1)
    
    
    	//예제1 논리연산자
	fmt.Println("ex : ", true && true)
	fmt.Println("ex : ", true && false)
	fmt.Println("ex : ", false && false)
	fmt.Println("ex : ", true || true)
	fmt.Println("ex : ", true || false)
	fmt.Println("ex : ", false || false)
	fmt.Println("ex : ", !true)
	fmt.Println("ex : ", !false)

	//예제2 비교연산자
	num1 := 15
	num2 := 37

	fmt.Println("ex : ", num1 < num2)
	fmt.Println("ex : ", num1 > num2)
	fmt.Println("ex : ", num1 == num2)
	fmt.Println("ex : ", num1 != num2)

}

- Bool(Boolean) : 참과 거짓
- 조건부 논리 연산자랑 주로 사용 : !, ||(or), &&(and)
- 암묵적 형변환 안됨 : 0, Nil -> False 변환 없음


  • Numeric, Go에서 다양하게 사용함(복소수도 있음)
//데이터 타입 : Numeric(1)

package main

import "fmt"

func main() {

	var num1 int = 17
	var num2 int = -68
	var num3 int = 0631       //8진수
	var num4 int = 0x32fa2c75 //16진수

	fmt.Println("ex1 : ", num1)
	fmt.Println("ex1 : ", num2)
	fmt.Println("ex1 : ", num3)
	fmt.Println("ex1 : ", num4)

}

- 데이터 타입 : 숫자형
- 정수, 실수, 복소수
- 32bit, 64bit, unsigned(양수)
- 정수 : 8진수(0), 16진수(0x), 10진수

//데이터 타입 : Numeric(2) go에서 다양하게 사용함

package main

import "fmt"

func main() {
	//데이터 타입 : 숫자형
	//정수형 문자 출력

	//예제1
	//아스키(영문)
	//byte 8bit
	var char1 byte = 72
	var char2 byte = 0110
	var char3 byte = 0x48

	//예제2
	//유니코드(한글)
	//rune 32bit
	var char4 rune = 50556   //유니코드
	var char5 rune = 0142574 //44032(8진수)
	var char6 rune = 0xC57C  //44032(16진수)

	//%c 문자, %d 10진수, %o 8진수, %x 16진수
	fmt.Printf("%c %c %c\n", char1, char2, char3)
	fmt.Printf("%d %d %d\n", char1, char2, char3)
	fmt.Printf("%d %o %x\n", char1, char2, char3)

	fmt.Printf("%c %c %c\n", char4, char5, char6)
	fmt.Printf("%d %d %d\n", char4, char5, char6)
	fmt.Printf("%d %o %x\n", char4, char5, char6)

}
  • 부동소수점 오차 주의
//데이터 타입 : Numeric(3)

package main

import "fmt"

func main() {
	//실수(부동소수점)
	//floot32(7자리), floot64(15자리)

	//예제1
	var num1 float32 = 0.14
	var num2 float32 = .75647
	var num3 float32 = 442.0378373
	var num4 float32 = 10.0

	//지수 표기법
	var num5 float32 = 14e6
	var num6 float32 = .156875e+3
	var num7 float32 = 5.32521e-10

	fmt.Println("ex1 : ", num1)
	fmt.Println("ex1 : ", num2)
	fmt.Println("ex1 : ", num3)
	fmt.Println("ex1 : ", num4)
	fmt.Println("ex1 : ", num4-0.1)
	fmt.Println("ex1 : ", float32(num4-0.1)) //형변환
	fmt.Println("ex1 : ", float64(num4-0.1)) //범위 폭 넓어지면 미세하게 값 달라짐. 부동소수점 오차 일어남 / 은행권등 주의!!
	fmt.Println("ex1 : ", num5)
	fmt.Println("ex1 : ", num6)
	fmt.Println("ex1 : ", num7)

}

- 값 계산할때 형변환으로 형 맞춰줌

- 주의) 범위 폭(ex.float64) 넓어지면 미세하게 값 달라짐 -> 부동소수점 오차 일어남. 

 

  

'GO언어' 카테고리의 다른 글

[GO] 제어문 및 반복문  (0) 2023.01.16
[GO] Go언어 특징,변수,상수,열거형  (1) 2023.01.05
[GO] 개발 환경 구축, 컴퓨터 원리  (1) 2023.01.03