您最喜欢的宠物在Go上写东西并获得比您更多的收入,但是您还没有? 不要浪费时间...这样的想法可能会从Go上大量的文章中带给读者。 一些公司甚至提供了使用这种语言进行再培训的机会。 如果您曾经考虑过要掌握一种语言,那么我想警告您。 而是显示一些奇怪的东西,尝试解释它们的原因,然后您自己决定是否需要使用Go。

本文适用于谁?
本文主要针对那些语言表达能力很重要的人。 同时也为那些想感受围棋的人。
我本人是C ++ / Python开发人员,可以说这种组合是掌握Go的最佳组合之一。 这就是为什么:
- Go通常用于编写后端服务,而很少用于其他所有内容。 同一对还有另外两个流行的对:Java / C#和Python / Ruby。 在我看来,Go是专门针对从Python / Ruby对中进行投资的。
- Go恰好从C语法的细微差别继承了它的奇怪行为,而C语法在语言中并不明显。 由于Go具有明显的拒绝点,因此您有时会想要删除Go编译器而忘记了它,因此了解C的原理以及Go在某种意义上是C的超集这一事实使得可以使它们变得平滑。
Java / C#对呢? Go从来不是她的竞争对手,至少在他年轻的时候(我们谈论的是Go 1.11版)。
文章中不会出现的内容
- 我们不会说Go语言是不好的,因为它不像Y语言一样具有X功能,每种语言都有自己的游戏规则,方法和支持者。 尽管我在欺骗谁,但是我们必须谈论它。
- 我们不会比较直接解释和编译的语言。
会发生什么? 语言在工作中只会带来不适的特定情况。
开始使用
简短的在线书籍
《 Go编程简介》是对语言手册的很好介绍。 读到您很快就会发现奇怪的功能。 首先,我们给它们第一批:
陌生人编译器
仅支持埃及括号仅支持
埃及括号 ,即以下代码无法编译:
package main
func main() //
{
}
, . — .
a := []string{
"q" // ,
}
-, . , , .
? !, .
package main
func main() {
a := []string{
"q",
}
// ,
}
, , , , . , . , . .
, . - .
, :
for _, value := range x {
total += value
}
. .
«»
. , , .
:
« , (..: ) . , , , , Java, C/C++, Python. , , . .»
: Go .
?
var x map[string]int
x["key"] = 10
:
panic: runtime error: assignment to entry in nil map
«» . , ?
tyderh , :
, , , . , .
:
var i32 int32 = 0
var i64 int64 = 0
if i64 == i32 {
}
, . Go (!) , , :
package main
import (
"fmt"
)
func eq(val1 interface{}, val2 interface{}) bool {
return val1 == val2
}
func main() {
var i32 int32 = 0
var i64 int64 = 0
var in int = 0
fmt.Println(eq(i32, i64))
fmt.Println(eq(i32, in))
fmt.Println(eq(in, i64))
}
, . false, , . , .
powerman :
func returnsError(t bool) error {
var p *MyError = nil
if t {
p = ErrBad
}
return p // Will always return a non-nil error.
}
err := returnsError(false)
if err != nil {
#
}
nil nil, . FAQ
.
. , ( ) . :
package main
import "fmt"
type storage struct {
name string
}
var m map[string]storage
func main() {
m = make(map[string]storage)
m["pen"] = storage{name: "pen"}
if data, ok := m["pen"]; ok {
data.name = "-deleted-"
}
fmt.Println(m["pen"].name) // Output: pen
}
pen. :
package main
import "fmt"
type storage struct {
name string
}
var m map[string]*storage
func main() {
m = make(map[string]*storage)
m["pen"] = &storage{name: "pen"}
if data, ok := m["pen"]; ok {
data.name = "-deleted-"
}
fmt.Println(m["pen"].name) // Output: -deleted-
}
"-deleted-", , , , «» .
?:
m = make(map[string]storage)
:
m = make(map[string]*storage)
, ? , :
package main
import "fmt"
var globState string = "initial"
func getState() (string, bool) {
return "working", true
}
func ini() {
globState, ok := getState()
if !ok {
fmt.Println(globState)
}
}
func main() {
ini()
fmt.Println("Current state: ", globState)
}
initial := . -
ok. ,
globState, ok := getState()
globState = getState()
, IDE , , .
, PVS Go.
: , .
«»
, , . , . .
, :
make([]int, 50, 100)
new([100]int)[0:50]
, , new, . .
, :
var i int = 3
j := 6
, , var .
, Go .
«»
, :
result, err := function()
if err != nil {
// ...
}
Go, . Go .
result, err := function(),
result, err = function(). , . —
:= = , .
«»
Go, , , , . .
- «», . 2018 Go 2.0,
, . , «» .
.
in not in. map :
if _, ok := elements["Un"]; ok {
}
— , , .
Go . . . SQL JOIN ORM GO (gorm) :
db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Scan(&results)
ORM :
query := models.DB.LeftJoin("roles", "roles.id=user_roles.role_id").
LeftJoin("users u", "u.id=user_roles.user_id").
Where(`roles.name like ?`, name).Paginate(page, perpage)
ORM . .
:
a.GET("/users/{name}", func (c buffalo.Context) error {
return c.Render(200, r.String(c.Param("name")))
})
- , .
, ? : . : , . . « » ( , ).
, - :
elements := map[string]map[string]string{
"H": map[string]string{
"name": "Hydrogen",
"state": "gas",
},
}
, ? - , . :
elements := map[string](map[string]string){
}
, go fmt, . .
. . « » .
helgihabr , 1.9
sync.Map.
. Go , :
if result != 1 {
t.Fatalf("result is not %v", 1)
}
, , assert . :
https://github.com/vizor-games/golang-unittest.
:
assert.NotEqual(t, result, 1, "invalid result")
. , «» . , . .
-:
string([]byte{'a'})
, :
y.(io.Reader)
. .
conversion, . static_cast ++.
type assertion . dynamic_cast ++.
vgo
,
JetBrains GoLand 2018.2, IDE :
vgo mod -vendor
, , . go2 .
1.11 . .
, Go, . , .
Go . : , . , ( RTTI) , .
, , .
- Go , . .
- Go . - : « 5, 3». , — , 4. , .
- . . . . .
- STL , . , map array. .