Open robert-min opened 1 year ago
type Home struct {
Address string
}
func (h Home) getAddress() {
fmt.Fprintf(h.Address)
}
func main() {
myhome := Home{"Seoul Gangnam"}
myhome.getAddress()
}
// output : Seoul Gangnam
type Home struct {
Address string
}
func (h *Home) getAddress() { fmt.Fprintf(h.Address) }
func (h *Home) fixAddress() { h.Adress = "Gyeongido" }
func main() { myhome := Home{"Seoul Gangnam"} myhome.fixAddress() myhome.getAddress() }
// output :Gyeongido
main
패키지가 있어야 하며 main
패키지 안에 main 함수가 정의 되어야 하며 이 함수가 프로그램의 시작위치가 됨.Alias Package Name
을 사용
import (
{별칭패키지명} "패키지"
"패키지"
)
// 코드 작성 시 위에 별칭패키지명으로 작업
### 빈칸 지시자 [이슈](https://stackoverflow.com/questions/21220077/what-does-an-underscore-in-front-of-an-import-statement-mean)
- Go lang에서는 패키지를 변수로 선언 시 무조건 사용해야 함.
- 패키지를 직접 사용은 하지 않지만 import를 통해 `init()` 함수를 실행시켜 패키지를 초기화해야 하는 경우에 빈칸 지시자를 사용
- 패키지를 import를 하게될 경우 기본적으로 `init()`함수를 호출하게 되는 데 init 함수만 호출하고 그 외의 기능은 사용하지 않을 때 패키지 앞에 `_` 빈칸지시자를 사용함.
```go
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
type INTERFACE_NAME interface {
METHOD_NAME(PARAMETER_NAME) RETURN_TYPE ...
}
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}
package main
import "fmt"
func main() {
var i int = 1
for i < 10 {
i *= 2
fmt.Println(i)
}
}
package main
import "fmt"
func main() { for { fmt.Println("Infinite loop") } }
### for range
- for range 문은 컬렉션으로 부터 한 요소(element)씩 가져와 차례로 for 블럭의 문장들을 실행
- for 인덱스,요소값 := range 컬렉션
```go
package main
import "fmt"
func main() {
names := []string{"a", "b", "c"}
for idx, name := range names {
fmt.Println(idx, name)
}
}
package main
func main() {
var a = 1
for a < 15 {
if a == 5 {
a += a
continue // for루프 시작으로
}
a++
if a > 10 {
break //루프 빠져나옴
}
}
if a == 11 {
goto END //goto 사용예
}
println(a)
END: println("End") }
- 아래와 같은 형식으로 작성 가능
```go
package main
func main() {
i := 0
L1:
for {
if i == 0 {
break L1
}
}
println("OK")
}
[배열의길이]타입{입력값}
array := [5]int{1, 2, 3, 4, 5}
array := [...]int{1, 2, 3}
slice := []int{1, 2, 3, 4,}
사이즈를 지정하면 배열로 선언되지만, 사이즈를 지정하지 않으면 슬라이스로 선언
package main
import (
"fmt"
)
func testArray(array [5]int) {
fmt.Printf("in testArray() func %p\n", &array)
}
func testSlice(slice []int) []int {
fmt.Printf("in testSlice() func %p\n", slice)
return append(slice, 6)
}
func main() {
array := [5]int{1, 2, 3, 4, 5}
fmt.Printf("origin ptr: %p\n", &array)
testArray(array)
// 배열을 슬라이스로 변환, 메모리 주소는 현재까지 동일함
slice := array[:]
fmt.Printf("%v, %p\n", slice, slice)
// 슬라이스에 새로운 데이터를 넣었을 때 메모리 값 변함
slice2 := testSlice(slice)
// 메모리가 변함. 새로 할당
fmt.Printf("%v, %p\n", slice2, slice2)
// 이후부터는 같음
slice2 = append(slice2, 7)
fmt.Printf("%v, %p\n", slice2, slice2)
}
# output
origin ptr: 0xc000100000
in testArray() func 0xc000100030
[1 2 3 4 5], 0xc000100000
in testSlice() func 0xc000100000
[1 2 3 4 5 6], 0xc00001a050
[1 2 3 4 5 6 7], 0xc00001a050
append
를 실행했을 때 메모리 주소 변경
배열은 새로운 인자를 받을 경우
callbyvalue
로, 슬라이스는callbyreference
로 받아, array는 배열 그 값을 복사하며, 슬라이스는 값의 포인터를 복사하는 것을 확인 즉, 인자를 추가하는 과정에서 array보다는 슬라이스가 시간 상 이점이 있음.
목차