Go入门篇

参考资料

Go语言的特性
https://www.jianshu.com/p/1bda5f24e474

菜鸟教程Go 语言入门级教程
http://www.runoob.com/go/go-program-structure.html

Go语言 高级入门教程系列
https://www.jianshu.com/c/2ba5a726a9f1

Go语言 高级教程系列
https://www.jianshu.com/u/1381dc29fed9

Go 语言最主要的特性:

Golang遵循“少即是多”的设计哲学,追求简洁优雅,就是说如果异常价值不大,就不会将异常加入到语言特性中。

  1. 主要优点
  • 易于开发:代码简洁(变量申明和省略分号)、使用方便(允许多返回值)、依赖更少避免臃肿、关键词少
  • 垃圾自动高效回收
  • 高并发性能好
  1. 其它的小特性
  • 更丰富的内置类型
  • 函数多返回值
  • 错误处理
  • 匿名函数和闭包
  • 类型和
  • 并发编程
  • 反射
  • 语言交互性
  1. 主要缺点
  • 不支持继承(继承可以少些代码),但是可以通过成员变量的方式实现类似的效果

Go的一些产品

  1. Docker
  2. 今日头条的后台服务器

细节

  1. package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
  2. 每行代码不需要分号,因为编译的时候会自动补齐
  3. 申明变量的时候可以不指定类型,可以直接var,也可以直接 number :=10
g, h := 123, "hello"
  1. 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型
const a, b, c = 1, false, "str"

const (
    Unknown = 0
    Female = 1
    Male = 2
)
  1. 数组:类似于java的 int[] 数组
var variable_name [SIZE] variable_type
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
var n [10]int   //申明一个长度为10的int类型的数组

arr:=[...] int {2:1,4:3} //申明一个下标为2的值为1,下标为4的值为3的长度为5的数组,因为最大下标是4
  1. 切片是对数组的抽象。数组要指定长度 [5],或者[…],但是切片不需要指定长度 [],支持cap()、len()、append()、copy()等函数,类似于java的ArrayList
s :=[] int {1,2,3 }
fmt.Println(cap(s),len(s),s[0])


初始化切片s,是数组arr的引用
s := arr[startIndex:endIndex] 

缺省endIndex时将表示一直到arr的最后一个元素
s := arr[startIndex:] 

通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片
s :=make([]int,len,cap) 

往一个切片中追加一个或者多个元素
numbers = append(numbers, 2,3,4)

  1. range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素,取代 len(slice)
nums := []int{2, 3, 4}

for i, num := range nums {
        if num == 3 {
            fmt.Println("index 3 :", i)
        }else{
             fmt.Println(num)
        }
    }

for j:=0; j< len(nums);j++ {
    if nums[j] == 3 {
        fmt.Println("index 3 :", j)
    }else{
        fmt.Println(nums[j])
    }
}
  1. 指针的使用:一个指针变量指向了一个值的内存地址,通过 var-type来申明指针的类型,var_name 来获取指针指向的真实值,var_name表示指针指向的内存地址
var var_name *var-type
 var a int= 20   /* 声明实际变量 */
 var ip *int        /* 声明指针变量 */
 ip = &a  /* 指针变量的存储地址 */
 /* 使用指针访问值 */
 fmt.Printf("*ip 变量的值: %d\n", *ip )  //打印20
  1. 申明一个Map的键值对集合,省去了get set方法,
/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type

/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)

初始化
countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}

set方法
countryCapitalMap [ "France" ] = "Paris"
countryCapitalMap [ "Italy" ] = "罗马"

get方法,ok显示是否存在该key
 captial, ok := countryCapitalMap [ "美国" ] /*如果确定是真实的,则存在,否则不存在 */

delete(countryCapitalMap, "France")

遍历Map
 for country := range countryCapitalMap {
        fmt.Println(country, "首都是", countryCapitalMap [ country ])
    }
  1. 接口:它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
定义一个Phone的接口,它的实现类必须实现call()方法
type Phone interface {
    call()
}

定义一个普通类NokiaPhone 
type NokiaPhone struct {
}

实现call()的方法
func (nokiaPhone NokiaPhone) call() {
    fmt.Println("I am Nokia, I can call you!")
}

使用
func main() {
    var phone Phone
    phone = new(NokiaPhone)
    phone.call()
}

Go语法 Vs Java语法

  1. 类对象申明吊打Java
  • 不需要再写get、set、和花式构造函数、toString等方法,Go对象自带了
type Books struct {
   title string
   author string
   subject string
   book_id int
}
  1. 变量声明更简洁,静态类型但是自动推断,甚至比JavaScript更简洁
var age=23
title := "Project Leader"
  1. 分号换行符可以省略,编译时自动添加

  2. Go的for循环更简洁

i := 1;
for i < 5 {
   fmt.Println(i);
   i++;
}
for i := 1; i < 5; i++ {
    fmt.Println(i);
}

i := 1;
for {
   fmt.Println(i);
   if ++i > 5 {
      break;   // or return;
   }
}
    原文作者:黄靠谱
    原文地址: https://www.jianshu.com/p/deeb252d66b8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞