lab golang study tutorials 01
Thu Jul 15, 2021Last modified: Sun Jul 18, 2021
-
Categories: (directories)
- ๐ Computer Engineering
-
Series: (travel the world of knowledge!)
- ๐ lab golang study
Go tutorials
- ๐๐๋ณธ ๋ด์ฉ์ tour.golang.org ์ ์๋ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Hello, Go world! (์ ํํ ๋ฆฌ์ผ์ ํ๋๋ก ๋ชจ์)
package main // ํ์ผ๋ค(ํจ์๋ค)์ ๋ชจ์๋์ ํ๋์ ์ธํธ
import ( // ์ด๋ฐ์์ผ๋ก ํ๋ฒ์ ์ํฌํธ ํ๋๊ฒ์ด ๊ถ์ฅ๋จ(factored style)
"fmt" // ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
"time" // ์๊ฐ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
"math/rand" // package rand ๋ก ์์ํ๋ ํ์ผ๋ค๋ก ๊ตฌ์ฑ๋จ.
"math/cmplx" // ๋ณต์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
"strings" // ๋ฌธ์์ด ๊ด๋ จ ํจ์ ๋ชจ์
)
/*
ํจ์ ์ ์ธ ๋ฐฉ๋ฒ:
func ํจ์๋ช
(๋ณ์_์ด๋ฆ ํ์
, ...) ์ถ๋ ฅ_ํ์
{
...
return ์ถ๋ ฅ๊ฐ
}
*/
func add(x int, y int) int {
return x + y
}
/*
์์ ๊ฐ์ ํจ์:
func add(x, y int) int {
// ๊ฐ์ ํ์
์ด๋ฉด ๋ฌถ์ด์ ์ ์ธ ๊ฐ๋ฅ
return x + y
}
*/
func swap(x, y string) (string, string) {
return y, x // ๋ณต์ ๊ฐ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ ๊ฐ๋ฅ
}
func split(sum int) (x, y int) { // ๊ฒฐ๊ณผ๊ฐ์ ์ด๋ฆ ๋ถ์ผ์ ์์
x = sum * 4 / 9
y = sum - x
return // ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์ ์ธํ ๋ณ์๋ค์ด ์ถ๋ ฅ๋จ
}
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim { // if ๋ณ์ ์ ์ธ(์ค์ฝํ๋ if ๋๋ else {}๋ธ๋ก์์์๋ง ์ ํจํจ)
return v
}
return lim
}
var c, python, java bool // ์ ์ญ๋ณ์
var i, j int = 1, 2 // ์ด๊ธฐ๊ฐ ์ ์ธ
var ( // factored ์ ์ธ ๊ฐ๋ฅ
ToBe bool = false
MaxInt uint64 = 1<<64 - 1
z complex128 = cmplx.Sqrt(-5 + 12i)
)
const Pi = 3.14 // ์์๋ := ํ๊ธฐ๋ฒ์ผ๋ก ์ ์ธ ๋ชปํจ
func main() {
fmt.Println("Hello, ไธ็") // \n ํฌํจ๋ ํจ์
fmt.Println("The time is", time.Now()) // ํ์ฌ ์๊ฐ ์ถ๋ ฅ
fmt.Println(math.pi) // ๋๋ฌธ์๋ก ์์ํ๋ฉด export ๋๊ณ (๋ค๋ฅธ ํ์ผ์์ ์ฌ์ฉ๊ฐ๋ฅ), ์๋ฌธ์๋ก ์์ํ๋ฉด export ์๋จ
fmt.Println(add(42, 13))
a, b := swap("hello", "world")
var i int // ์ง์ญ๋ณ์, i ์ด๊ธฐํ(0)
var c, python, java = true, false, "no!" // ์ ์ธ๋ ๊ฐ์ผ๋ก ์ด๊ธฐํ
k := 3 // ํจ์ ์์์๋ ์งง์ ํํ์ ๊ฐ๋ฅ, ํจ์ ๋ฐ์์๋ ์๋ฌ. var ๋ก ์์ํด์ผํจ
fmt.Println(i,j,k, c, python, java)
fmt.Printf("Type: %T Value: %v\n", ToBe, ToBe)
fmt.Printf("Type: %T Value: %v\n", MaxInt, MaxInt)
fmt.Printf("Type: %T Value: %v\n", z, z)
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
sum = 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
sum = 1
for sum < 1000 { // for == while
sum += sum
if sum > 100 {
break
}
}
fmt.Println(sum)
/*
for {
}
// ๋ฌดํ ๋ฃจํ
*/
// Go ์ switch๋ฌธ์ break ์ํด๋ ๋๋ค!
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.\n", os)
}
switch { // ์กฐ๊ฑด ์์ผ๋ฉด switch true ์ ๊ฐ์
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
/*
1. defer ๋ฌธ์ ์์ ์ด ํฌํจ๋ ํจ์ ๋ธ๋ก์ด ์ ๋ถ ์คํ๋๋ฉด ์ ์ผ ๋ง์ง๋ง์ ์คํ๋จ
2. stack ๊ตฌ์กฐ(defer ๋ฅผ ๋๊ฐ ํ๋ฉด ๋์ค์ ๋ค์ด๊ฐ ์ชฝ์ด ๋จผ์ ์คํ๋จ)
*/
defer fmt.Println("world")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
/*
Go์ ํฌ์ธํฐ๋ ํฌ์ธํฐ ์ฐ์ฐ์์ด ๊ทธ๋ฅ
์ฃผ์ โ ๊ฐ ์ ๊ด๊ณ,
address โ value ์ ๊ด๊ณ์์
address == &value ์ฐธ์กฐ(์ฃผ์<-๊ฐ)
*address == value ์ญ์ฐธ์กฐ(์ฃผ์->๊ฐ)
*/
i, j := 42, 2701
p := &i // point to i
fmt.Println(*p) // read i through the pointer
*p = 21 // set i through the pointer
fmt.Println(i) // see the new value of i
p = &j // point to j
*p = *p / 37 // divide j through the pointer
fmt.Println(j) // see the new value of j
type Vertex struct {
// ๊ตฌ์กฐ์ฒด๋ ์ฌ๋ฌ ํ์
์ ํ๋๋ก ๋ชจ์ ์งํฉ
X int
Y int
}
fmt.Println(Vertex{1, 2})
v := Vertex{1, 2}
v.X = 4 // .(dot) ์คํผ๋ ์ดํฐ๋ก ์ ๊ทผ ๊ฐ๋ฅ
fmt.Println(v.X)
v := Vertex{1, 2}
p := &v // ์๋๋ ์ฃผ์๊ฐ์ด๋๊น (*p).X ์ด๋ ๊ฒ ์จ์ผํ๋๋ฐ
p.X = 1e9 // ์๋ต ๊ฐ๋ฅํจ
/*
c ์์๋ -> (arrow) ์คํผ๋ ์ดํฐ๋ฅผ ์ผ๋๋ฐ
Go ์์๋ ๋จ์ํจ์ ์ํด์ ๊ทธ๋ฅ ์๋ตํ๋ฏ?
๋์ค์ ํจ์ํ์ ์ง์ํ๊ธฐ ์ํด์์ผ๊น?
์์ง๊น์ง๋ ์๋ฃ์๊ฑฐ ๋ณด๋ฉด ๊ทธ๋ฅ ์์ ์๊ฐ์ด ์๋๋ฏ
2021-07-18T16:24:50+09:00
*/
fmt.Println(v)
v1 = Vertex{1, 2} // has type Vertex
v2 = Vertex{Y: 1} // X:0 is implicit?
v3 = Vertex{} // X:0 and Y:0
p = &Vertex{1, 2} // has type *Vertex
// ์ฝ๊ฒ(?!) ๊ธฐ์ตํ๋ ๋ฒ
// type => some value of some type ==> x: type
// array => n number of type ==> [n]type
var a [10]int
// declares a variable a as an array of **ten integers**
// ์ฃผ์: array ๋ ํ์
์ ์ผ์ข
์ด๋ฏ๋ก resize ๋ถ๊ฐ
// array์ ์นดํผ๋ณธ์ธ slice ๋ผ๋ ๊ฐ๋
์ด ์์
// ์ฃผ์2: slice ๋ ๋ ํผ๋ฐ์ค๋ฅผ ๊ณต์ ํจ
// ์ฆ, slice ์์ ํ๋ฉด array ๋ ์์ ๋จ
// ๊ทธ๋ฆฌ๊ณ ๊ฐ์ array๋ฅผ ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ์ง๋ slice ๋ํ ๋ ํผ๋ฐ์ค๋ฅผ ๊ณต์ ํจ
primes := [6]int{2, 3, 5, 7, 11, 13}
var s []int = primes[1:4]
fmt.Println(s)
// slice๋ง ๋ง๋ค๋ฉด array๋ ์๋ ์์ฑ๋จ(์ผ์ข
์ ๋ ํผ๋ฐ์ค)
q := []int{2, 3, 5, 7, 11, 13}
fmt.Println(q)
q1 := q[0:4]
q1[2] = 1000
r := []bool{true, false, true, true, false, true}
fmt.Println(r)
fmt.Println(q)
s := []struct {
i int
b bool
}{
{2, true},
{3, false},
{5, true},
{7, true},
{11, false},
{13, true},
}
fmt.Println(s)
s := []int{2, 3, 5, 7, 11, 13}
s = s[1:4]
fmt.Println(s)
s = s[:2]
fmt.Println(s) // ์ํ ํํ ์์ผ๋ฉด ๊ทธ๋ฅ ๋๊น์ง
s = s[1:]
fmt.Println(s)
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)
// Slice the slice to give it zero length.
s = s[:1]
printSlice(s)
// Extend its length.
s = s[1:4]
printSlice(s)
s = s[:5]
printSlice(s)
// Drop its first two values.
s = s[2:]
printSlice(s)
s = s[2:]
printSlice(s)
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)
// Slice the slice to give it zero length.
s = s[2:]
printSlice(s)
// Extend its length.
s = s[1:2]
printSlice(s)
s = s[:3]
printSlice(s)
// Drop its first two values.
s = s[2:]
printSlice(s)
s = s[1:]
printSlice(s)
s = s[:1]
printSlice(s)
var s []int
var p *int
fmt.Println( s, len(s), cap(s),p)
if s == nil {
fmt.Println("nil slice")
}
if p == nil {
fmt.Println("nil pointer")
}
fmt.Printf("%T, %T" ,s,p)
a := make([]int, 5)
printSliceAndString("a", a)
b := make([]int, 0, 5)
printSliceAndString("b", b)
c := b[:2]
printSliceAndString("c", c)
d := c[2:5]
printSliceAndString("d", d)
board := [][]string{
[]string{"_", "_", "_"},
[]string{"_", "_", "_"},
[]string{"_", "_", "_"},
}
// The players take turns.
board[0][0] = "X"
board[2][2] = "O"
board[1][2] = "X"
board[1][0] = "O"
board[0][2] = "X"
fmt.Println(len(board))
fmt.Println((board[0]))
// strings.Join -> string
// func append(s []T, vs ...T) []T
for i := 0; i < len(board); i++ {
fmt.Printf("%s\n", strings.Join(board[i], " "))
}
var s []int
printSlice(s)
if s == nil {
fmt.Println("nil slice!")
}
// append works on nil slices.
s = append(s, 0)
printSlice(s)
if s == nil {
fmt.Println("nil slice!")
}
// The slice grows as needed.
s = append(s, 1)
printSlice(s)
// We can add more than one element at a time.
s = append(s, 2, 3, 4)
printSlice(s)
// range => iterator
// for ๋ฌธ ํ๊ณ ๊ฐ์ด ์ฐ์ด๋๊น ๊ทธ๋ฅ ํ๋์ ๋ฌธ๋ฒ์ด๋ผ๊ณ ๋ณด๋๊ฒ ๋ง์๋ฏ
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
for i:=0; i<len(pow); i++ {
fmt.Printf("2**%d = %d\n", i, pow[i])
}
fmt.Printf("this is range\n")
for i, d := range pow {
res := math.Pow(2, float64(i))
fmt.Printf("2**%d = %d == %f\n", i,d,res)
}
fmt.Println()
fmt.Printf("this is just for loop\n")
for i:=0; i<len(pow); i++ {
res := math.Pow(2, float64(i))
fmt.Printf("2**%d = %d == %f\n", i, pow[i], res)
}
// ์ด๊ฑฐ ์ข์ ๊ตฌ๋ฌธ์ธ๋ฏ, 2 ๊ฑฐ๋ญ์ ๊ณฑ์ ์ด๋ฐ์์ผ๋ก ๊ตฌํ๋ค๋๊ฒ ๋นํธ์ฐ์ฐ์ด๋ผ์ ์ข์๋ฏ
// ํ์คํ ์ด๋ฐ ๋ถ๋ถ์ ์ข ๋ฐฐ์ฐ๋ฉด ์ข์ํ
๋ฐ...
pow := make([]int, 10)
for i := range pow {
pow[i] = 1 << uint(i) // == 2**i
}
for _, value := range pow {
fmt.Printf("%d\n", value)
}
type Gps struct {
Lat, Long float64
}
var m map[string]Gps
m = make(map[string]Gps)
m["Bell Labs"] = Gps{
40.68433, -74.39967,
}
fmt.Println(m["Bell Labs"])
var m = map[string]Gps{
"Bell Labs": Vertex{
40.68433, -74.39967,
},
"Google": {
37.42202, -122.08408},}
msi := make(map[string]int)
msi["Answer"] = 42
fmt.Println("The value:", msi["Answer"])
msi["Answer"] = 48
fmt.Println("The value:", msi["Answer"])
delete(msi, "Answer")
fmt.Println("The value:", msi["Answer"])
val, ok := msi["Answer"]
fmt.Println("The value:", val, "Present?", ok)
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Printf("type is %T\n",hypot)
fmt.Println(hypot(5, 12))
fmt.Println(compute(hypot))
fmt.Println(compute(math.Pow))
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
/*
๋ ์ซ์ดํ๋ ์ ๋ฐ๊ฒฌ...
์ธ๋ฏธ์ฝ๋ก ์ ๊ฐ์ ํ์ง ์์ผ๋ฉด์
struct ์ ์ฝค๋ง๋ ๊ฐ์ ๋จ...
์ฝค๋ง ์ํ๋ฉด ์๋ฌ๋จ...
์ฝค๋ง ๋์ {} ์ค๊ดํธ ๋ธ๋ก์ ๋ซ์ผ๋ฉด ์๋ฌ ์๋จ. ์ง์ง ์ด์ํ๋ฐ๋ ๊ฐ๋จํด์ ์ฌ๋๋ค์ด ์ฐ๋๊ฑด๊ฐ?
javascript ๋ lisp ์ฒ๋ผ?
์ฐจ๋ผ๋ฆฌ rust ๋ฅผ ์ฐ๊ฒ ๋ค. ์น์ ๋์ฒด์ ๊ฐ ๋ฐ๋ก ์๊ณ ๊ทธ๋ฅ ํธ๋์คํ์ผ๋ฌ? ํธ๋์ค ์ปดํ์ผ๋ฌ๋ง ์์๋ฟ์ด๊ณ ...
lisp ๋ ๋ฌธ๋ฒ์ด ์๋ ๋จ์ํ์ง๋ง ํด์ํ๊ธฐ๊ฐ ์ข ํ๋ ๋ฉด์ด ์์ด์...
์ง์ง ๊ทน๋์ ๋จ์ํจ์ ์ถ๊ตฌํ๋ ๋ณํ์ ์ธ ์ธ์ด๋ผ๊ณ ํด์ผํ๋...
haskell ๋ ๋ฐ์ง๊ณ ๋ณด๋ฉด ์๋ฐํ ์์ํจ์ ๋ฐ์ง๋ ๋ณํ๊ณ ...
์ธ์ด๋ผ๋๊ฒ ๋ค ๊ทธ๋ ์ง๋ญ...
rust๋ ์ํด๋ด์ ๊ทธ๋ ์ง ๋ง์ ๋ฐฐ์ฐ๋ฉด ๋ ๋ญ๊ฐ ์์์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
๊ทผ๋ฐ ownership ์ ๋๋ฌด ๋ฐํด์ ๋ ๋นจ๋ฆฌ ๋ฐฐ์ฐ๊ณ ์ถ์ ๋ง์๋ ๊ณต์กดํจ.
*/
/*
A slice is formed by specifying two indices, a low and high bound, separated by a colon:
a[low : high]
#slice-2 ์๋ฌดํผ ๊ทธ๋๋ ์ ๋ฆฌ๋ฅผ ํ์๋ฉด,
capacity ๋ผ๋ ๊ฐ๋
์ low bound ์๋ง ์ํฅ์ ๋ฐ๋๋ค
high bound ์๋ ์๋ฌด๋ฐ ์ํฅ์ด ์๋ค
length ๋ผ๋ ๊ฐ๋
์
low bound, high bound ๋ชจ๋์ ์ํฅ์ ๋ฐ๋๋ค
The zero value of a slice is nil.
A nil slice has a length and capacity of 0 and has no underlying array.
*/
/*
#slice-1 ์ฌ๊ธฐ์ ๋ด๊ฐ go๋ฅผ ์ซ์ดํ๋ ์ด์
๊ณ์ฐ ๋ฐฉ์์ด ํต์ผ๋์ง์๊ณ ์ข์ฐ๊ฐ ๋ค๋ฅด๋ค
์ด๋ค ๋๋์ด๋๋ฉด,
๋์ค์ gob ์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์
์ธ์ฝ๋ฉ ํ ๋๋ ๋น์ด์๋ ๋ฒํผ๋ฅผ ์ธ์ฝ๋ ์์ญ์ผ๋ก ์ง์ ํ๊ณ b ๋ผ๋ ๋ณ์๋ฅผ ์ธ์ฝ๋ฉํด์ ์ ์ฅํ๋ค
(์ฌ๊ธฐ์ b ๋ Block์ด๋ผ๋ ํ์
์ ํฌ์ธํฐ => ์ฆ, ์ฃผ์)
var res bytes.Buffer
encoder := gob.NewEncoder(&res)
err := encoder.Encode(b)
๊ทธ๋ฆฌ๊ณ ๋์ฝ๋ฉ ํ ๋๋ data์ ์คํธ๋ฆผ์ ๋ฐ์์
๋์ฝ๋ ๊ฐ์ฒด๋ก ๋ง๋ฌ
๊ทธ๋ฆฌ๊ณ ๋์ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ๋์ฝ๋ฉํ๋๋ฐ,
์ด๋ ๋น์ด์๋ block ์ด๋ผ๋ ๋ณ์์ ์ฃผ์์ ์ง์ด๋ฃ์
(์ฌ๊ธฐ์ block ์ Block์ด๋ผ๋ ํ์
์ ๊ฐ => ์ฃผ์ ์๋)
var block Block
decoder := gob.NewDecoder(bytes.NewReader(data))
err := decoder.Decode(&block)
์ฐธ๊ณ :
binary ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ๋,
.BigEndian ์ ์ธ์ ์์๋๋ก ๋ค์ด๊ฐ๊ณ ,
.LittleEndian ์ ์ธ์์ ์ญ์์ผ๋ก ๋ค์ด๊ฐ
๊ทธ๋์ ๋ญ๊ท์ง๊ฐ ํ๋ก๊ทธ๋๋จธ์ ๋ง์ถ๋๊ฒ ์๋๋ผ,
ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ญ๊ท์ง์ ๋ง์ถฐ์ผํ๋ ์ด์ด์๋ ์ํฉ์ด ์๊ธด๋ค
ํจ์ํ ์ธ์ด์ฒ๋ผ ์ฌ๋ฌ ์ ์ฝ์ ์ ์ํด์ ์ป๋๊ฒ ๋ง์ผ๋ฉด ๋ชฐ๋ผ๋, ์ด๊ฑด ๊ทธ๋ฅ ์ธ์ด ์์ฒด๊ฐ ์ฃผ๋ ํผ๋๋๋ฌธ์ ์ป๋๊ฒ๋ ์์ด ํท๊ฐ๋ฆฌ๊ฒ ๋๋ค
์ฐจ๋ผ๋ฆฌ ์์ ์์ ๋๋ฅผ ๋์ด๋ ค๋ฉด
clojure ์ฒ๋ผ ์์ ๊ท์น์ด ๋ช๊ฐ ์๋์ง,
(์ฌํํด์ ์ฝ๋๋ ๋นจ๋ฆฌ ์ฝ๋๋ฐ,
์ฝ๋๋ฅผ ์ดํดํ๊ธฐ๊ฐ ์ด๋ ต๋ค
์ปดํจํฐ๋ ์ดํดํ๊ธฐ ์ฌ์ธ๋ฏ)
haskell์ด๋ rust ์ฒ๋ผ ์์ ์์ ๋๋ฅผ ์ ํํด์ ํํ๋ ฅ์ ์๋ ๋์ ,
๊น๋ํจ๊ณผ ์์ ์ฑ์ ํ๋ณดํ๋๊ฒ ๋ซ๋ค๊ณ ์๊ฐํ๋ค
(์ฝ๋๋ฅผ ์ฝ๊ธฐ๋ ์ด๋ ค์ด ๋์ ,
์ดํดํ๋๊ฑด ์๋์ ์ผ๋ก ์ฝ๋ค
์ธ๊ฐ์ด ์ดํดํ๊ธฐ ์ฌ์ด ์ํ๊ณผ ์ ์ฌํ ๋ฌธ๋ฒ)
*/
}
func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
func printSliceAndString(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n",
s, len(x), cap(x), x)
}
Note:
- ์ธ๋ฏธ์ฝ๋ก ์์
- ๊ธฐ๋ณธ ํ์
:
bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // uint8์ ๋ณ์นญ rune // int32์ ๋ณ์นญ // ์ ๋์ฝ๋์์ code point๋ฅผ ์๋ฏธํฉ๋๋ค. float32 float64 complex64 complex128 - ์ด๊ธฐ๊ฐ:
zero value ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ซ์ type์๋ 0 boolean type์๋ false string์๋ "" (๋น ๋ฌธ์์ด) ์ถ๊ฐ: slice ๊ธฐ๋ณธ๊ฐ์ nil slice ~~(๋ฅ ์ฌ๋ผ์ด์ค!)~~ ํฌ์ธํฐ ๊ธฐ๋ณธ๊ฐ๋ nil ํฌ์ธํฐ <nil> - ํ์
๋ณํ
var i int = 42 var f float64 = float64(i) var u uint = uint(f) // ํน์ ์ข ๋ ๊ฐ๋จํ: i := 42 f := float64(i) u := uint(f) - ๋ฐ๋ณต๋ฌธ์ for ๋ฐ์ ์์.
- () ๊ดํธ ์๊ณ , {} ํ์!
์ง๋ฌธ ๋ฆฌ์คํธ
- ์ดํด๊ฐ 100ํผ์ผํธ ์๋จ.
Numeric Constants Numeric constants are high-precision values. An untyped constant takes the type needed by its context. Try printing needInt(Big) too. (An int can store at maximum a 64-bit integer, and sometimes less.) ์ซ์ํ ์์ ์ซ์ํ ์์๋ ๋งค์ฐ ์ ํํ ๊ฐ ์ ๋๋ค. type์ด ์ ํด์ง์ง ์์ ์์๋ ๊ทธ๊ฒ์ ๋ฌธ๋งฅ์์ ํ์ํ type์ ์ทจํฉ๋๋ค. needInt(Big) ์ ์ถ๋ ฅํด๋ณด์ธ์. (int ๋ ์ต๋ 64-bit ํน์ ๋๋๋ก ๋ ์์ ์ ์๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.) - ํด๋ก์ ์ข๋ ํด์ผ๋จ
ํด์ฆ
- array ์ slice ์ฐจ์ด๋?
- range ๋ฌธ๋ฒ์ map ์ ์ ์ฉํ๋ฉด?
- ์๋ ์ํฉ์์๋ ์ด๋ป๊ฒ ๋ ๊น?
var sum = 0
func adder() func(int) int {
var sum = 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}