Go语言学习路

Go语言学习基础笔记

2019-06-21  本文已影响0人  TZX_0710

Go

1.声明变量

  1.指定变量类型 (variable)
  var  i int
  如果未指定默认值 那么默认值为0
  2.自动判断值类型 
  var  i="string";
  3.省略var 初始化声明
  hello:="spark"
  
  多变量声明
  1.指定声明变量的类型 统一类型
  var i,k,s,w int 
  2.声明不同的类型
  var (
  i int
  str string
  b bool
  )
  !!!在同一个作用域当中 不能对变量进行二次初始化 :变量名=v

2.Go语言常量

  const关键词  常量声明语法
  1.单个常量声明方法 显示声明 const 变量名 变量类型=value
  const str string  ="100"
  2.隐示声明 可省略string  因为会自动推断类型
  const str ="100"
  const str,str1 int
  3.枚举声明
  const (
  MAN=1
  GIRL=0
  )
  4.特殊常量iota 在const关键词出现时被重置为0 每次出现一次+1可以把iota当作const索引
  const(
  MAN=iota
  MAIN=iota
  )

3.运算符

//算术运算符
+ - * /  ++ --
//关系运算符 跟Java中的一致
== !=  > <  >= <= 
//逻辑运算符
&& || !

4.for循环

//berak关键词  停止当前循环
//goto  跳转到指定的标签
//continue  跳过当前循环
func  main()  {
    //var i="string";

    for i:=1; i<=10 ;i++  {
    //  goto  breakHader
        if(i==1){
            fmt.Println(i)
        }else if(i==10){
            fmt.Println("执行")
            goto  breakHader
        }else{
            if(i==5){
                fmt.Println(i)
                break;
            }
        }
    }

breakHader:
    fmt.Print("Message")
}

5.Go函数

//声明函数
func  function_name(param list)(return paramList)
{
  //函数体
}
//demo
func GetMaxNum(a  ,b int)(int){
    //声明一个返回变量
    var result int
    if(a<b){
        result=b;
    }else if(b>a){
        result=a
    }
    return result
}
//main函数
//noinspection ALL
func  main()  {
    //var i="string";
    var num=GetMaxNum(1,10);
    fmt.Print(num)
}
//匿名函数 把一个函数作为方法的返回值
func function_name func()匿名函数返回值//int {

}

func getSequenes() func()int{
    var i =0
    return func() int{
        i++
        return i;
    }
}
//noinspection ALL
func  main()  {
    sequene := getSequenes()
    fmt.Println(sequene())
    fmt.Println(sequene())
    //var i="string";
    //var num=GetMaxNum(1,10);
    //fmt.Print(num)
}

6.数组声明

[length]Type
[N]Type{value1, value2, ..., valueN}
[...]Type{value1, value2, ..., valueN}  初始化数组
  var 数组名称[] type
  //不指定数组长度
  var 数组名称=[...]int{1,2,3,4,501}

7.语言指针

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。指针接受的是一个变量的内存地址 如果直接赋值会报错
访问指针中的值 采用 *指针名称
一个指针变量指向了一个值的内存地址。

//输出变量地址
var n [10]int /* n 是一个长度为 10 的数组 */
  n[0]=100
  fmt.Printf("变量的地址: %x\n", &n[0]  )
//声明指针

//声明一个变量
  var a=10
  //声明指针变量
  var  i *int
  //存储 &a的地址
  i=&a
  fmt.Printf("a 变量的地址是: %x\n", &a  )

  /* 指针变量的存储地址 */
  fmt.Printf("ip 变量储存的指针地址: %x\n", i )

  /* 使用指针访问值 */
  fmt.Printf("*ip 变量的值: %d\n", *i )

8.结构体定义

Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
可以理解为是一个对象

  定义语法
  type sturct_name struct{
    filedName  type
  }
 
//demo    
  //noinspection ALL
type Student struct {
  title string
  name  string
  age   int
  Book[]  int

}
//声明对象的方法可以采用以下函数
func (stu *Student)GetInfo()(Student)
{

}
//noinspection ALL
func  main()  {
  var studet Student
  studet.title="Ubuntu"
  studet.name="Mac"
  studet.age=18
  var boo=[]int{1,2,3,4,50}
  studet.Book=boo
  fmt.Print(studet)
}

type Student struct {
  title string
  name  string
  age   int
  Book[]  int

}
//匿名函数 声明一个对象的专有函数  传入指针类型 表示 可以修改
//
//为Student类型绑定Area的方法,*Rect为指针引用可以修改传入参数的值c (stu *Student) Getage()( *Student){
  stu.age=20
  return stu
}
//noinspection ALL
func  main()  {
  var stu *Student
  var student Student
  student.age=19
  stu=&student;
  //获取得到一个student的地址
  i := stu.Getage()
  age := i.age
  println(age)
}

9.切片

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
切片是一种引用类型

~~ 新获得的切片跟源切片底层对应的数组都是同一个,所以对其中一个切片元素的修改也会影响到另外一个

声明切片语法 
make([]type, length, capacity)
make([]type, length)
[]type{}
[]type{value1, value2,..., valueN}

s[n]             切片s中索引位置为n的项
s[n:m]           从切片s的索引位置n到m-1处所获得的切片
s[n:]            从切片s的索引位置到len(s)-1处所获得的切片
s[:m]            从切片s的索引位置0到m-1处所获得的切片
s[:]             从切片s的索引位置0到len(s)-1处获得的切片
var identifier []type
切片初始化
s:=[]int{1,2,3}

/* 创建切片  长度为4 最长长度可以达到4*/
    slice := make([]int, 2, 4)
    append_slice := []int{1, 2}
    fmt.Printf("slice addr:%p len:%d cap:%d slice:%v\n",      slice, len(slice), cap(slice), slice)
//追加2个元素 地址未改变
    slice = append(slice, append_slice...)
    fmt.Printf("slice addr:%p len:%d cap:%d slice:%v\n", slice, len(slice), cap(slice), slice)
//继续追加 地址改变
    slice = append(slice, 10, 20)
    fmt.Printf("slice addr:%p len:%d cap:%d slice:%v\n", slice, len(slice), cap(slice), slice)

    slice = append(slice, 30, 40, 50)
    fmt.Printf("slice addr:%p len:%d cap:%d slice:%v\n", slice, len(slice), cap(slice), slice)
    
    
slice addr:0xc000052140 len:2 cap:4 slice:[0 0]
slice addr:0xc000052140 len:4 cap:4 slice:[0 0 1 2]
slice addr:0xc00006c140 len:6 cap:8 slice:[0 0 1 2 10 20]
slice addr:0xc00008a000 len:9 cap:16 slice:[0 0 1 2 10 20 30 40 50]

10.创建Map集合

声明map的方式
var hashMap=make(map[keyType]valueType);
var hashMap=make(map[string]string)

    hashMap["Lucy"]="张三"
    hashMap["Ad"]="Nike"

    for k, v := range hashMap {
        fmt.Println(k+"\t"+v)
    }
    //删除函数
    delete(hashMap,"Lucy")
    for k, v := range hashMap {
        fmt.Println(k+"\t"+v)
    }

11.类型转换

type_name(exp)

var name=12 
var str=string(12)

12.接口定义 实现

demo

//定义一个say的接口
type Say interface {
    sayHelloWorld();
}
type  sayHello struct {

}
type saySpeak struct {

}

//实现类
func (say sayHello) sayHelloWorld()  {
      fmt.Println("helloworld")
}

//实现类
func ( saySpeak saySpeak)sayHelloWorld(){
    fmt.Println("Nice")
}

func main() {
    var say Say
    say=new(sayHello)
    say.sayHelloWorld();

    say=new(saySpeak);
    say.sayHelloWorld();

}

13 异常情况

package main

import (
    "fmt"
)

// 定义一个 DivideError 结构
type DivideError struct {
    dividee int
    divider int
}

// 实现 `error` 接口
func (de *DivideError) Error() string {
    strFormat := `
    Cannot proceed, the divider is zero.
    dividee: %d
    divider: 0
`
    return fmt.Sprintf(strFormat, de.dividee)
}

// 定义 `int` 类型除法运算的函数
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
    if varDivider == 0 {
            dData := DivideError{
                    dividee: varDividee,
                    divider: varDivider,
            }
            errorMsg = dData.Error()
            return
    } else {
            return varDividee / varDivider, ""
    }

}

func main() {

    // 正常情况
    if result, errorMsg := Divide(100, 10); errorMsg == "" {
            fmt.Println("100/10 = ", result)
    }
    // 当被除数为零的时候会返回错误信息
    if _, errorMsg := Divide(100, 0); errorMsg != "" {
            fmt.Println("errorMsg is: ", errorMsg)
    }

}
上一篇下一篇

猜你喜欢

热点阅读