목록언어/Golang (27)
SYeonni Study Room
func Myid() string { var chars = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0987654321") str := make([]rune, 5) for i := range str { str[i] = chars[rand.Intn(len(chars))] } return string(str) } Go로 5글자의 랜덤 id를 만들어보는 함수

이전 두 프로그램을 비교하여 포인터 인수의 함수가 다음과 같은 포인터를 사용해야함을 알 수 있습니다. var v Vertex ScaleFunc(v, 5) // Compile error! ScaleFunc(&v, 5) // OK 포인터 리시버가 있는 메소드는 다음과 같이 호출될 때 값이나 포인터를 리시버로 받아들입니다. var v Vertex v.Scale(5) // OK p := &v p.Scale(10) // OK v 라는 문장의 경우, v.Scale(5) 는 v 가 포인터가 아니라 값인데도 포인터 리시버가 있는 메서드는 자동으로 호출됩니다. 즉, Scale 메서드가 포인터 리시버를 가졌기 때문에 편의상 Go는 v.Scale(5) 라는 것을 (&v).Scale(5) 로 해석합니다.

포인터 리시버로 메소드를 선언 할 수 있습니다. 이는 리시버 유형이 일부 유형 T 에 대한 리터럴 구문 *T 를 가짐을 의미합니다. (또한 T 자체는 *int 와 같은 포인터가 될 수 없습니다.) 예를 들어, 여기서 Scale 메소드는 *Vertex 에 정의되어 있습니다. 포인터 리시버가 있는 메소드는 Scale 처럼 리시버가 가리키는 값을 수정할 수 있습니다. 메소드는 종종 리시버를 수정해야하기에 포인터 리시버가 값 리시버보다 더 일반적입니다. 16 행의 Scale 함수 선언에서 * 를 제거하고 프로그램의 동작이 어떻게 변하는 지 관찰해보십시오. 값 수신기를 사용하면 Scale 메서드가 원래 Vertex 값의 복사본에서 작동합니다. (이것은 다른 함수 인수와 동일합니다.) Scale 메소드에는 main..

Go 함수들은 클로저일 수도 있습니다. 클로저는 함수의 외부로부터 오는 변수를 참조하는 함수 값입니다. 함수는 참조된 변수에 접근하여 할당될 수 있습니다. 이러한 의미에서 함수는 변수에 "bound(바운드)" 됩니다. 그 예로, adder 함수는 클로저를 반환합니다. 각 클로저는 그 자체의 sum 변수에 bound(바운드) 되어 있습니다.

맵의 모든 데이터를 출력해보겠습니다. 배열, 슬라이스와 마찬가지로 맵도 for 반복문에서 range 키워드를 사용합니다. range 키워드를 사용하면 반복문이 실행될 때 마다 맵의 키와 값이 자동으로 변수에 들어갑니다. range의 리턴값에서 키 변수를 사용하고 싶지 않다면 _ (밑줄 문자)를 사용합니다.

Go 언어는 기본 자료형으로 맵을 지원합니다. 맵은 해시 테이블, 딕셔너리라고도 하며 키-값 형태로 자료를 저장합니다. 또한, 슬라이스와 마찬가지로 레퍼런스 타입 var 맵명 map[키_자료형]값_자료형 var a map[string]int [ ] (대괄호)안에는 키의 자료형을 지정하고 그 뒤에 값의 자료형을 지정 맵의 zero value는 nil 입니다. nil 맵은 키도 없고, 키를 추가할 수도 없습니다. make 함수는 주어진 타입의 초기화되고 사용 준비가 된 맵을 반환합니다. 맵은 make 함수를 사용하여 공간을 할당해야 값을 넣을 수 있습니다. 여기서 맵 선언과 동시에 make 함수를 사용하면 map 키워드와 자료형을 생략할 수 있습니다. 또한, 일반 변수와 마찬가지로 :=를 사용하여 var를 ..

for 에서 range 는 슬라이스 또는 맵의 요소들을 순회합니다. 슬라이스에서 range 를 사용하면, 각 순회마다 두 개의 값이 반환됩니다. 첫 번째는 인덱스이고, 두 번째는 해당 인덱스 값의 복사본입니다. package main import "fmt" var pow = []int{1, 2, 4, 8, 16, 32, 64, 128} func main() { for i, v := range pow { fmt.Printf("2*%d = %d\n", i, v) } } Range continued _ 을 할당하여 인덱스 또는 값을 건너뛸 수 있습니다. for i, _ := range pow for _, value := range pow 만약 인덱스만을 원하면, 두 번째 변수를 생략할 수 있습니다. for i..

슬라이스는 내장된 make 함수로 생성할 수 있습니다. 이것은 동적 크기의 배열을 생성하는 방법입니다. make 함수는 0으로 이루어진 배열을 할당합니다. 그리고 해당 배열을 참조하는 슬라이스를 반환합니다 용량을 지정하려면, make 함수의 세 번째 인자에 값을 전달하면 됩니다. package main import "fmt" func main() { a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[:2] printSlice("c", c) d := c[2:5] printSlice("d", d) } func printSlice(s string, x []int) { fmt.Printf("%s len=%..

package main import "fmt" func main() { s := []int{2, 3, 5, 7, 11, 13} printSlice(s) // Slice the slice to give it zero length. s = s[:0] printSlice(s) // Extend its length. s = s[:4] printSlice(s) // Drop its first two values. s = s[2:] printSlice(s) } func printSlice(s []int) { fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) } 마지막 cap이 4가 나와 헷갈렸음.. 나뿐만 아니라 다른사람도 헷갈렸음 ㅠㅠ 친절한 답변으로 이해함! https..