0516-Go(1)

망지·2022년 5월 16일
0
post-custom-banner

Go 설치

https://go.dev/

다운로드 클릭 후 os에 맞는 패키지 설치.

C:\Users\r2com>go version
go version go1.18.2 windows/amd64

Go 작업공간

*GoPATH 환경 변수

*작업 공간의 기본 디렉터리 (GO PATH=);
$HOME/go
%USERPROFILE%\go

C:\Users\r2com>setx path "%path%;%GOPATH%\bin"
기존 path 에 path추가 =>"%path%;이게 있어야 추가임. 없으면 대체되므로 조심하기.

C:\Users\r2com>set gopath
GOPATH=C:\Users\r2com\go

cf.)셸이란?

*%GOPATH%\bin
%GOPATH%\src

go 명령어

go run[go 파일 ... or go 패키지]

  • 작은 프로그램 테스트
  • Go를 스크립트 언어처럼 사용 시
C:\Users\r2com>notepad hello.go
package main

import "fmt"

func main() {
    fmt.Println("hello, world!")
}
C:\Users\r2com>go run hello.go
hello, world!

#큰따옴표 써야함. 작은따옴표 혼용하지 않음.

#fmt; formatting

#대소문자 구분해줘야함

C:\Users\r2com>go run hello.go
# command-line-arguments
.\hello.go:6:9: undefined: fmt.println

=> fmt.println (p를 소문자로 작성하여 발생한 오류.)

go build[go 파일 ... or go 패키지]

  • 바이너리(실행파일) 생성
C:\Users\r2com>go build hello.go

C:\Users\r2com>dir hello.*
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 8E5C-804C

 C:\Users\r2com 디렉터리

2022-05-16  오전 10:37         1,892,352 hello.exe
2022-05-16  오전 10:34                82 hello.go
               2개 파일           1,892,434 바이트
               0개 디렉터리   9,834,074,112 바이트 남음
C:\Users\r2com>go build -o hello_world.exe hello.go

C:\Users\r2com>hello_world
hello, world!

서드파티 Go도구 설치

  • go는 다른 언어와 달리 자신의 코드 저장소를 공유하여 패키지를 직접 다운받고 설치 가능
C:\Users\r2com>go install github.com/rakyll/hey@latest

C:\Users\r2com>hey https://www.golang.org

코드포매팅

  • 효율적인 코드 작성을 위함

go gmt

  • 들여쓰기 공백 수정
  • 조체 항목 정렬
  • 산자 주변 적절한 공백 사용 체크
C:\Users\r2com>go fmt hello.go

C:\Users\r2com>notepad hello.go

goimports

=>import 문 정리

  • 알파벳 순 정렬
  • 용되지 않은 import 삭제
  • mport 추측(추론): 100% 정확하지 않

=>enhanced go fmt
=>go install 명령으로 설치 필요 (p.28 참조)

C:\Users\r2com>go install golang.org/x/tools/cmd/goimports@latest

goimports -l -w .

세미콜론 삽입 규칙

  • go fmt는 이 규칙에 의해 잘못 삽입된 중괄호({})는 수정 못함
package main

import "fmt"

func main() 
{
    fmt.Println("hello, world!")
}
C:\Users\r2com>go fmt hello.go
hello.go:6:1: unexpected semicolon or newline before {
exit status 2

=>고치진 못해도 알려는 줌.

  • Go 컴파일러가 자동으로 문장 끝에 세미콜론을 붙여줌
C:\Users\r2com>go run hello.go
# command-line-arguments
.\hello.go:6:1: syntax error: unexpected semicolon or newline before {
  • 규칙
    • 식별자
    • 기본 리터럴
    • 다음 토큰 중 하나: break, continue, fallthrough, return, ++, ‘--’, }, )

린팅, 베팅

  • Effective Go

  • Go 위키의 코드 리뷰 규칙

  • linter

    • 1978년 시작
    • 코드가 스타일 가이드를 잘 지켰는지 확인
      • 알맞은 변수 이름 지정
      • ...
    • 100% 정확도 아님
    • 설치(p.31)

개발 도구 소개

VSC

  • Go 개발을 위한 VS Code 구성

https://docs.microsoft.com/ko-kr/azure/developer/go/configure-visual-studio-code

이외 dlv, go for VSC 등 확장 설치 필요

Go playground

Makefiles(텍스트 파일)

*make 프로그램 필요

go1.15.6 env

기본 데이터 타입과 선언

내장타입

https://go101.org/
https://go101.org/article/basic-types-and-value-literals.html

1) 불리언
2) 숫자

  • 정수: 주로 int 사용, 경우에 따라 byte
  • 실수
  • 복소수

3) 문자열
4) 별칭:byte(uint8), rune(int32)

제로 값
선언되었으나 값이 할당되지 않은 변수에 기본 값 제로(0) 할당

리터럴

  • 코드에 작성하는 값 그 자체

  • 정수 리터럴

    • 10진수, 8진수, 16진수, 2진수 ⇒ 접두사 이용 (없음, 0o, 0x, 0b)
    • 밑줄(underscore): 정수 리터럴 사이에 1_234
  • 부동 소수점 리터럴

    • 점(.)
    • e(E) 지수 표현
    • 밑줄 가능
  • 룬 리터럴

    • 작은 따옴표
    • 단일 유니코드 문자, 8비트 8진 숫자, 8비트 16진수 숫자, 16비트 16진수 숫자, 32비트 유니코드
    • 이스케이프 시퀀스를 묶을 때: '\n','\t', ...'
  • 문자 리터럴

    • 두 가지 방법
    • 1) 해석된 문자열 리터럴: 큰 따옴표 사용
    • 2) 로(raw) 문자열: 역따옴표(백틱) 사용
  • 다른 타입으로 선언된 두 정수는 연산 불가능

    • 하지만, 부동소수점 변수에 정수 리터럴 사용 가능
      정수 변수에 부동소수점 리터럴 사용 가능
  • 왜냐, 리터럴 자체에는 데이터 타입이 없으므로
package main

import "fmt"

func main() {
	fmt.Println("Hello. world!")

	var x int8 = 0
	var y int16 = 1
	fmt.Println(x + y)

}
  • Go 언어는 실용적 언어 => 리터럴에는 타입이 정해져 있지 않다

불리언

  • true, false

숫자 타입

  • 정수 타입

    • 특수한 경우 아니면 int 사용
    • int가 기본 타입
  • 특수 정수 타입들

    • byte: uint8 보다 선호
    • int: 플랫폼에 따라서 int32, int64
    • uint: 플랫폼에 따라서 uint32, uint64
    • rune: int32지만 용도가 다르다
    • uintptr: 포인터
  • 정수 연산자

    • 산술연산자의 결과는 정수
    • 복합대입연산자도 지원
    • 비교연산자
    • 비트연산자
    • 시프트연산자
  • 부동소수 타입

    • float32, float64(기본 타입)
      10.234 =>리터럴 부동소수 타입 지정해주고 싶으면 float64 10.234이런식으로 타입 지정해주어야 함.
    • %(나머지 연산)에 대해서는 정의되어 있지 않음
    • 부동소수 변수끼리 ==, != 비교는 가능하나 사용하지 말자.
  • 복소수 타입

문자열과 룬 맛보기

  • 문자열

    • 제로 값: 비어있는 문자열
    • 비교연산자 가능
    • 연결연산자(+)
    • 불변(immutable)
    • 큰 따옴표
    • 단일 코드 포인트
    • 작은 따옴표
    • int32의 별칭

명시적 타입 변환
cf.) Explicit vs. Implicit
명시적 vs. 암시적(암묵적)
⇒ Manual vs. Automatic

  • 자동 타입 변환
    • 편리
    • 변환 규칙이 복잡, 예기치 못한 결과 초래 가능
  • Go는 자동 타입 변환 불허
    • 의도의 명확성 및 가독성 중시 때문
    • 명시적으로 타입 변환해야 함 무조건.
      ->모든 타입 변환 규칙을 외울 필요 없음.

->둘 다 숫자인데도 x+y 밑줄.

->타입변환해주면 밑줄(오류)없어짐

  • 다른 Go 타입을 불리언으로 취급할 수 없다.
    • 조건식은 반드시 비교식으로 작성

var vs. :=

  • 변수 선언 스타일에 따른 의도가 존재

  • var 키워드
    [SYNTAX]
    var 변수 타입 = 값(표현식)

    • 값의 타입이 예상가능하면 타입 생략 가능
    • 값을 생략하면 타입의 제로 값이 대입
    • 같은 타입의 여러 변수 또는 다른 타입의 여러 변수 동시 선언 가능
    • 여러 변수의 제로 값 동시 선언 가능
  • 다양한 변수를 한 번에 선언

    • 선언리스트를 괄호로 묶어서

  • := 짧은 선언
    • var 키워드(X)
    • 타입(X)
    • 함수 밖에서는 사용 불가 = package 레벨에서는 사용 불가


var 다시 사용 x , 재할당시 x = 30 이렇게 할당해 줄 것.
uint로 변수 선언 -> type 출력시 uint로 나옴 . 보통은 int

위에서 정의 된 변수(x,y)라도 새로운 변수(z)와 함께 추가하면 잘 작동함. => z밑줄인 이유는 아래에서 호출 안했기 때문.


const 사용

  • 상수: 상수 변수
  • 한 번 대입한 값을 변경할 수 없다
  • 컴파일 시 값이 결정되어야 한다, 즉 변수를 대입할 수 없다.
  • 리터럴에 이름을 부여하는 방법

타입 지정 상수와 타입 미지정 상수

  • 타입 미지정 상수는 리터럴과 같은 취급
  • 프로그래밍 의도

Scale up vs Scale out

scale up ; cpu성능 올리기, 램 1G-> 4G 등
scale out ; 비슷한 성능의 컴퓨터 더 사기.
=>컴퓨터간의 연동이 중요해짐 (이 때 클러스터가 중요)

기타

함수의 인터페이스 ; 함수 헤더

함수는 값, 블랙박스, 코드블럭에 이름 붙인 것

GO는 값을 직접 복사.
(파이썬 - 주소 복사[참조한다])

SQL트랜잭션 - 커피주문하고 받고 거스름돈 받고 이런걸 하나의 단위로 보겠다. -> 원자적 연산
앞에 했던 여러 작업이 있더라도 하나라도 잘못되면 다시해야 함. 모든 작업이 완전히 잘 끝나야 완성된다. 하나라도 잘못되면 안됨. ex)계좌이체
이렇게 과정을 하나로 묶는 것을 원자적 단위. 원자적 연산.

인터페이스 ; 접근을 위한 모든 건 연결?사이간 얼굴.

Go는 변수를 만들었으면 반드시 써야한다.

package main

import "fmt"

func main() {
	one := 1
    	fmt.Println("hello, world!")
}
C:\Users\r2com>go run hello.go
# command-line-arguments
.\hello.go:6:2: one declared but not used

명령프롬프트에서 드라이브 바꾸기

C:\Users\r2com>cd d:\go

C:\Users\r2com>d:

d:\go>

보수(complement)
n진법 : n의 보수 => n-1의 보수 +1,

n-1의 보수 => 각 자리의 보수를 n-1에서 뺸 것




profile
꾸준히, 차근차근
post-custom-banner

0개의 댓글