学习 go 语言之基本语法

作者: | 更新日期:

最近在从 c++/python 语言转型到 go 语言,第一篇笔记是基本语法。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

一、背景

最近在从 c++/python 语言转型到 go 语言,第一篇笔记是基本语法。

从语言角度看,各家语言在语法上相差都不大。
都有基本类型、变量、结构体、数组、库文件引入、循环、条件判断等。

下面我们就来简单的看看 go 语言里的这些语法吧。

二、基本类型

像其他语言一样,go 有 boolintbyte(类似于 c 的 char)、floatstring等。

int 的内存不确定,所以也有确定内存大小的int8 int16 int32 int64
当然,也有对应的无符号类型uint

float有 32 位和 64 位两种。

Unicode编码使用 新类型 rune 表示。

对于 go 语言的类型,有一个注意事项就是,没有类型隐式转化。
这个可以避免很多潜在的问题。

三、变量

默认变量需要主动声明类型,且所有变量都有默认值,不存在未定义变量。

// var 变量名列表 类型
var first, second int

当然也支持增加初始化的值。

var first, second int = 1, 2

而对于函数内的临时变量,支持类型自动推导。

first, second := 1, 2

四、函数

go 的函数不支持重载,但是可以返回多个返回值。

func next(x ,y int) (int, int){
    return y, x+y
}

五、包

库函数以包的形式引入。

//定义包名
package main

//分别一个包
import "fmt"  
import "math"

//批量引入包
import (
    "fmt"
     "math"
)

六、循环

go 语言只有 for 循环。

sum := 0
for i := 0; i < 10; i++ {
    sum += i
}
fmt.Println(sum)

当然,for的三个表达式可以只保留一个,就相当于while了。

sum = 1
for sum < 1000 {
    sum += sum
}
fmt.Println(sum)

死循环则可以全部忽略

for {
}

七、条件语句

条件语句和往常的语言差不多。

func max(x ,y int) int {
    if x < y {
        return y
    }else if x == y{
        return x;
    }else{
        return y
    }
}

而对于 switch 改动则较大。
比如每个case不需要break了,而且case支持表达式,而不是常量。


switch os := "linux"; os {
case "darwin":
    fmt.Println("OS X.")
case "l" + "inux":
    fmt.Println("Linux.")
default:
    fmt.Printf("%s.\n", "other")
}

你可能注意到了, switch 后面多了一个变量定义。
这个是 go 新增的语法, if 语句也支持, 相当于给条件判断这个作用域声明一个临时变量。

八、指针

go 支持指针,但是不支持对指针的运算。
这样就没有内存越界的问题了。

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

为什么需要指针呢?
因为对于基本类型,函数都是值传递的。
有时候想通过函数的参数返回值怎么办?传指针。

九、结构体

go 的结构体中,成员与方式是分离的。

type Vertex struct {
    X, Y float64
}

func (v Vertex) sum() float64 {
    return X + Y
}

可以看到,通过 type 定义一个类型,然后再函数前加一个(变量 类型)为类型增加方法。

go 一个更巧妙的功能是如果定义了一个同名方法的接口,这个类型就能赋值给接口变量了。
这个相当于 c++ 语言里的纯虚函数,从而可以实现多态。

十、最后

好了,对于 go 的初级基本知识,就记录到这里了。

记得几年前我就尝试看 go 的书籍了,可是到一个月前还没看完第一章。
而最近我算法比赛的时候,直接使用 go 写代码,当场 google 语法,结果算法题通过时,go 语言的基本语法也学得差不多了。
而且由于是直接上手实践的,各种编译不过,最终对这些语法的印象也特别深刻。

学习一个新东西,最快的入门方法就是尽快动手开始实践,边实践边学习,几个小时就入门了。

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越