Golang - 문자열, 모듈과 패키지

Lumi·2022년 2월 8일
0

Golang

목록 보기
8/38
post-thumbnail

🔥 문자열

다양한 방식에 대해서만 다루었습니다.

-``- 를 활용한다면 좀더 쉽게 문자열을 띄어쓰기 하여 사용 가능합니다.

  • len은 바이트 길이값을 출력합니다.
  • 즉 이코드는 12byte를 반환하게 됩니다.

문자열의 byte문제입니다.

기본적으로 영단어의 경우에는 1byte를 지원하기 떄문에 문제없이 출력이 되는 것을 볼수 있습니다.

  • 띄어쓰기 또한 1byte로 작동을 합니다.

하지만 한글의 경우에는 3byte를 잡아먹기 떄문에 1byte로 표현이 되지 않고 있는 것을 출력창을 통해서 볼 수가 있습니다.

또한 보이는 바와 같이 7번쨰라고 하면 라는 단어가 나와야 하지만 byte로 보았을떄에는 7번쨰는

h e l l o (띄어쓰기) 월(3byte) 드(3btye)

이라는 단어릐 중간 byte를 가르키는 것을 알 수가 있습니다.

  • 앞에 까지의 byte갯수는 6이기 떄문입니다.
  • 이 3byte를 잡아먹기 떄문에 이런 결과가 나오는 것이기도 하고요

  • 또다른 방법은 순회방식은 이와 같습니다.

이 방식은 rune이라는 int32의 별칭타입을 활용합니다.

  • 출력값이 정상적으로 나오는 이유는 int32는 4byte로 표현을 하기 떄문입니다.
  • 일반적인 string은 1byte로 표현을 하기 떄문에 원하는 값이 표현이 되지 않는것 입니다.

또한 string같은 경우에는 [8]rune와 같이 Fix된 배열로는 형변환이 되지 않고 반드시 동적 배열을 통해서만 형변환이 이루어 져야 합니다.

  • 다른 방식의 순회는 이와 같습니다.

이외에도 문자열을 비교하는 ==, !=, < 등등은 다른 언어와 같게 적용이 가능합니다.

string의 구조

string 타입의 구조를 구조체로 작성을 해보면

struct {
	length int  // 길이값
    address int // 주소값
}

이런식으로 구성이 되어 있습니다.

일단 hello라는 string이라는 값이 선언이 되면 메모리에는 해당 변수에 맞는 주소가와 영역이 선언될 것입니다.

이때 주소값은 address라는 변수가, 길이값은 length라는 변수가 가지게 되면서 string이 구성이 됩니다.

  • 알아야 할 부분은 string을 선언할떄에 주소값은 8byte로 고정이 되어 있습니다.

문자열은 불변 입니다.

이와 같이 string값을 바로 바꾸는 행위는 불가능 하고 따로 byte라는 동적배열로 변환을 한뒤에 실행을 시켜야 합니다.

이떄 str과 slice값이 서로 다른 이유는 서로 다른 메모리 주소가 생성이 되었다는 것을 의미합니다.

대문자, 소문자로 바꾸기

import (
	"fmt"
	"strings"
)

func ToUpper2(str string) string{
	var builder strings.Builder

	for _,v := range str {
		if (v>= 'a' && v <= 'z'){
			builder.WriteRune('A' + (v - 'a'))
		}else{
				builder.WriteRune(v)
		}
	}

	return builder
}

strings패키지를 활용하면 좀더 효율적으로 합산이 가능합니다.

기본적으로 string변수에 합산을 하게 되면 합산을 할떄마다 새로운 주소를 할당하고 복사하는 과정이 진행이 되기 떄문에 메모리적으로 굉장히 비 효율적입니다.

하지만 strings패키지를 활용하면 동적배열을 가지고 있다는 점에서 메모리 효율적으로 작동시킬수 있습니다.

🔥 모듈과 패키지

기본적인 모듈과 패키지에 관한 내용이였으며 이전과 동일하게 이런식으로도 활용하는구나에 대해서 정리를 하였습니다.

package명이 겹치는 경우

import (
	"text/template"
    "html/template"
)

이런식으로 서로 패키지 명이 겹치게 되면 별칭을 추가해 줌으로써 해결이 가능합니다.

import (
	"text/template"
    htemplate "html/template"
)

이후 사용을 할떄에는 htemplate를 활용함으로써 이용 가능합니다.

패키지 또한 호출이 되었다면 반드시 사용을 해야 합니다.

  • 변수와 같이

하지만 호출만 함으로써 이용되는 부과효과?? 라는 부분이 있기 떄문에 만약 호출만한뒤 사용을 하지 않고자 한다면

import (
	"text/template"
    _ "html/template"
)

이런식으로 _를 추가 함으로써 무시할수 있습니다.

  • 이름이 없기 떄문에 html/template에 해당하는 패키지를 사용하지 않아도 오류가 발생하지 않습니다.

또한 파일도 그냥 import를 통해서 불러올수 있습니다.

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글