Go语言基础概念

Go语言基础概念

2014年2月17日 go语言学习

个人论述:关于程序语言,每个程序员都有不同的看法和观点,有人觉得C++语言好用,够快;有人觉得C语言好用够强大,又有人觉得Java好用,够简洁。目前编程语言数不胜数了,目前排在前面的还是C、C++、Java,这三种语言使用人数最多的,历史也是最悠久的。它们都是经过无数程序员千锤百炼而慢慢成熟起来的,现在很难评判说到底哪个语言好用或者开发出来的程序功能强大,讨论这些是没有意义的,一个语言到底能做什么东西全靠程序员个人的功力和对语言的熟悉程度,它毕竟是一个工具,工具是我们开发程序的利器,只有万般打磨才能变得锋利无比。自然使用过很多种语言的大牛来说,自然有自己喜爱的语言,因为他可能更明白每一种语言的特性,哪一种能让自己开发变得轻松自在。所以对于语言的评判,是没有标准答案的,我每次看到程序员因为语言而吵起来我就觉得好笑,有这种闲心不如多提升自己的技术水平好过。对我而言,能开发出好的应用好的软件的语言就是好语言,只有喜不喜欢,没有好不好之说。

为了扩展自己的知识面呢,小巫也开始打算学习新的语言,毕竟技术这个东西,有时候怎么死的都不知道,跟着潮流走可以降低自己的风险。Go语言呢,也有几年的时间了,是Google推出的第二款开源语言,我稍微学了一下,发现它似乎不太符合我的口味,虽说它看起来很简洁,把一些不必要的东西去除掉,但可读性似乎差了点。因为还没深入学,没有体会到开发这门语言的大神的用意,所以先放下自己的偏见,试着把这门语言入门一些。

Go语言基础概念_第1张图片

最简单Go语言程序

package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}


接下来我会逐一介绍Go语言的基础概念,如下

1. 包是什么?

2. 导入和导出

3. 函数

4. 返回值

5. 变量的声明

6. Go语言基本数据类型

7. 常量的定义


这里推荐一个在线编程学习的网站吧(FenBy),关于Go语言的摘录我是从这个网站里学习的。

http://www.fenby.com/course/units/1015#top


1、包概念


  • 每个 Go 程序都是由包组成的。
  • 程序运行的入口是包 `main`。
  • 这个程序使用并导入了包 "fmt" 和 `"math"`。
  • 按照惯例,包名与导入路径的最后一个目录一致


小巫注:

  • Go语言导入包的方式跟Java是类似的,关键字也是import,不过有很大差别的是,它导入的类库不用进行分隔,只是用双引号括起来代表一个类库。
  • 包名“main”是程序入口,这个跟Java似乎不一样,Java可以分为很多个包,用于避免同名冲突的情况。然而Go语言似乎就只有一个main?

2. 导入和导出


1、怎么导入

这个代码用圆括号组合了导入,这是“factored”导入语句。同样可以编写多个导入语句,例如:

import "fmt"
import "math"


2、导出

在导入了一个包之后,就可以用其导出的名称来调用它。在 Go 中,首字母大写的名称是被导出的。

Foo 和 FOO 都是被导出的名称。名称 foo 是不会被导出的。执行代码。然后将 math.pi 改名为 math.Pi 再试着执行一下。

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(math.pi)
}

3. 函数 

1、函数用法(1)

函数可以没有参数或接受多个参数。

在这个例子中,"add" 接受两个 int 类型的参数。

注意类型在变量名 _之后_。

package main

import "fmt"

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

func main() {
    fmt.Println(add(42, 13))
}

2、函数用法(2)

当两个或多个连续的函数命名参数是同一类型,则除了最后一个类型之外,其他都可以省略。
在这个例子中 ,
x int, y int
被缩写为
x, y int

package main

import "fmt"

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

func main() {
    fmt.Println(add(42, 13))
}

3、new 函数


表达式 new(T) 分配了一个零初始化的 T 值,并返回指向它的指针。


var t *T = new(T)

t := new(T)

package main

import "fmt"

type Vertex struct {
    X, Y int
}

func main() {
    v := new(Vertex)
    fmt.Println(v)
    v.X, v.Y = 11, 9
    fmt.Println(v)
}

4、函数为值

函数也是值。Function values

package main

import (
    "fmt"
    "math"
)

func main() {
    hypot := func(x, y float64) float64 {
        return math.Sqrt(x*x + y*y)
    }

    fmt.Println(hypot(3, 4))
}

5、函数的闭包
并且函数是完全闭包的。
函数 adder 返回一个闭包。每个闭包被绑定到了特定的 sum 变量上。

package main

import "fmt"

func adder() func(int) int {
    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),
        )
    }
}

6、练习:斐波纳契闭包

现在来通过函数做些有趣的事情。

实现一个 fibonacci 函数,返回一个函数(一个闭包)可以返回连续的斐波纳契数。

package main

import "fmt"

// fibonacci 函数会返回一个返回 int 的函数。
func fibonacci() func() int {
    var count,sum1,sum2 int = 0,1,1
    return func() int {
        switch count {
            // 0和1,fib =1
        case 0,1:
            count++;
        default:
            sum1,sum2 = sum2, sum1+sum2
           
        }
        return sum2
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

4.返回值 (1/2)

1、多返回值

函数可以返回任意数量的返回值。

这个函数返回了两个字符串。

package main

import "fmt"

func swap(x, y string) (string, string) {
    return y, x
}

func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b)
}


2、命名返回值

函数接受参数。在 Go 中,函数可以返回多个“结果参数”,而不仅仅是一个值。它们可以像变量那样命名和使用。

如果命名了返回值参数,一个没有参数的 return 语句,会将当前的值作为返回值返回。

package main

import "fmt"

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

func main() {
    fmt.Println(split(17))
}


5. 变量的声明 (1/3)

1、变量

var 语句定义了一个变量的列表;跟函数的参数列表一样,类型在后面。

package main

import "fmt"

var x, y, z int
var c, python, java bool

func main() {
    fmt.Println(x, y, z, c, python, java)
}

2、初始化变量

变量定义可以包含初始值,每个变量对应一个。

如果初始化是使用表达式,则可以省略类型;变量从初始值中获得类型。

package main


import "fmt"


var x, y, z int = 1, 2, 3
var c, python, java = true, false, "no!"


func main() {
    fmt.Println(x, y, z, c, python, java)
}

3、短声明变量

在函数中,`:=` 简洁赋值语句在明确类型的地方,可以用于替代 var 定义。

(`:=` 结构不能使用在函数外,函数外的每个语法块都必须以关键字开始。)

package main

import "fmt"

func main() {
    var x, y, z int = 1, 2, 3
    c, python, java := true, false, "no!"

    fmt.Println(x, y, z, c, python, java)
}

6.基本数据有哪些 (1/1)

1、基本类型

Go 的基本类型有Basic types

bool

string
int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的别名
rune // int32 的别名
// 代表一个Unicode码
float32 float64
complex64 complex128

7.常量的定义 (1/2)

1、常量

常量的定义与变量类似,只不过使用 const 关键字。

常量可以是字符、字符串、布尔或数字类型的值。

package main

import "fmt"

const Pi = 3.14

func main() {
    const World = "世界"
    fmt.Println("Hello", World)
    fmt.Println("Happy", Pi, "Day")

    const Truth = true
    fmt.Println("Go rules?", Truth)
}

2、数值常量

数值常量是高精度的 _值_。

一个未指定类型的常量由上下文来决定其类型。
也尝试一下输出 needInt(Big) 吧。


package main

import "fmt"

const (
    Big   = 1 << 100
    Small = Big >> 99
)

func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
    return x * 0.1
}

func main() {
    fmt.Println(needInt(Small))
    fmt.Println(needFloat(Small))
    fmt.Println(needFloat(Big))
}



你可能感兴趣的:(Go语言基础概念)