В кои случаи дадена променлива е достъпна извън пакета, в който е дефинирана?
Кога обединяваме дефиницията на няколко променливи така
var ( name string = "Мъфинчо" age uint8 = 5 )
вместо така
var name string = "Мъфинчо" var age uint8 = 5
?
Къде НЕ можем да ползваме type-inference
?
От какви типове може да бъде всяка константа?
За какво се ползва ключовата дума iota
?
enum
1. Функции
2. Ламбди
3. Методи
func fоо(a int, b string) float
Функцията foo приема int и string и връща float
func sum(args ...int) int
Функцията sum приема произволен брой числа и връща техния сбор
func sum(args ...int) int { result := 0 for _, v := range args { result += v } return result }
* Как е реализирано в "стари" езици:
- C/C++ и компания: масив или структура
- Python: tuple-и
* Как е реализирано в Go?
- Много просто: връщате каквото ви трябва
* Защо?
- По-лесно log-ване на грешки
- Улеснява handle-ване на състояния
package main
import "fmt"
func main() {
fmt.Println(sumAndCount(2, 3, 4, 5))
}
func sumAndCount(args ...int) (int, int) { result := 0 for _, v := range args { result += v } return result, len(args) }
1. Знаем, че ако дефинираме променлива и не я използваме, гърми
2. Ако искаме онзи сбор и не ни интересува броят аргументи, това ще изгърми
result, count := sumAndCount(2, 3, 4, 5)
3. Ако нямаме нужда от дадена стойност, я присвояваме на _:
result, _ := sumAndCount(2, 3, 4, 5)
package main
import "fmt"
func main() {
fmt.Println(sumAndCount(2, 3, 4, 5))
}
func sumAndCount(args ...int) (result int, count int) { count = len(args) result = 0 for _, v := range args { result += v } return }
package main
import "fmt"
func main() {
fmt.Println(factorial(5))
}
func factorial(x uint) uint { if x == 0 { return 1 } return x * factorial(x-1) }
ЗнаетеЛиЧеHelloWorldНаКитайскиЕ世界
е валидно име на функцияpackage main
import "fmt"
func main() { add := func(x, y int) int { return x + y } fmt.Println(add(4, 5)) fmt.Println(func(x, y int) int { return x + y }(3, 8)) }
За тях ще си говорим, като стигнем до дефиниране на типове
&
*int
intP == *(&intP)
package main import "fmt" var ( name string = "Чочко" age uint8 = 27 p_name *string ) func main() { p_name = &name fmt.Printf("name е на адрес %p и има стойност %s\n", p_name, name) fmt.Printf("age е на адрес %p и има стойност %d\n", &age, age) }
package main func main() { var p *int = nil *p = 0 }
func fоо(a int, b *string) float
Функцията foo приема int и указател към string и връща float
Демек a
бива копиран в скоупа на foo
, а b
просто сочи към някаква стойност отвън.
b
не се копира. Ако в него има около 652183859 символа, това е предимствоa
не влияе на нищо извън тази функцияb
променяме оригиналната стойност