C,C++에서와 같이 포인터를 사용할 수 있다. ( 문법은 같다 )
배열은 data 크기, data type, 값을 선언해주어야 한다.
slice는 arr에서 크기를 지정하지 않으면 만들어진다. 특이한 점은 append를 할 때 기존의 값에 추가되는 것이 아니라, 추가된 값으로 return을 뱉는다.
만약 index 1의 원소를 지우고 싶으면
1까지 slicing하고, 2부터 뒤에까지를 slicing 한뒤 ... -> slice로 만들어줘야 되는 것 같다.
그런데 왜 이렇게 복잡하게 만들어놓은지는 잘 모르겠다.
그냥
arr.append()
arr.delete()
등으로 만드는 게 더 편했을 것 같은데... 이유가 있겠지
선언 방법이 특이하다.
다른 구조와 마찬가지로 for - range 를 이용할 수 있다.
go에는 class, object가 없고, struct 위주로 돌아간다.
위와 같이 value들만 전달하는 형태로 사용할 수도 있지만, 위위의 코드처럼 key값을 적어주는 것이 가시적으로 좋다.
account struct를 만들고, owner와 balance를 설정할 수 있다고 해보자.
account와 멤버변수에 접근하기 위해서는 모두 public으로 선언해야 하므로 모두 대문자로 선언해야 한다.
그런데 이렇게 만들면 정보은닉이 제대로 지켜지지 않는다.
그래서 account 자체는 private으로 만들고, getter를 만든다.
method는 struct 안에 선언하는게 아니라, 외부에서 선언한다.
a Account <--- 이 부분을 리시버라고 하며, 명명규칙은 struct의 앞글자를 따온다.
허나 만약 위의 코드대로 실행한다고 하더라도 제대로 동작되지 않는 것을 볼 수 있다.
왜냐하면 go는 인자를 넘길 때, 복사된 값을 넘기기 때문이다.
만약 해당 객체에 대한 값을 바꾸고 싶은 것이라면, 포인터 값으로 값을 받는다고 명시해주어야 한다.
포인터 값으로 변경하면 정상작동한다.
Java에서의 toString이 Go에서는 String()으로 구현돼있다.
그래서 그냥 struct를 찍어보면 위와 같이 나온다.
새롭게 override하고 싶다면, 위와 같이 String() method를 재정의 해주면 된다.
WithDraw라는 function을 선언해서 출금을 하는 메서드가 있다고 해보자.
만약 위와 같이 돈을 갖고 있는 돈에 초과해서 뺀다면, 예외처리가 발생해야 한다.
허나 지금은 -10이 출력되고 있다.
🔥GO에는 Try-Catch나 Exception이 없다. 오직 error만 존재한다.
🔥그래서 GO에서는 항상 err 처리가 강제된다.
WithDraw function을 위와 같이 수정할 수 있다.
nil = null
log.Fatalln은 print하고 프로그램을 종료시킨다.
좀 더 깔끔한 코드를 위해 err들을 한데 모으는 것도 방법이다.
err를 변수로 선언해서 모을 땐, 변수명 앞에 err를 붙여주는 것이 명명규칙이다.