学习go 简单版

本文章对有java、c基础,想要快速学习go的童鞋们快速入门go

因为最近java比较卷,想要学学go

接下来,上火车咯

结构

package main

import "fmt" //用来输出、接受值

同一目录不要有一样的函数名

  • 不用括号

    • for后面不用括号

      • for i:=0 ; i<n ; i++{}

    • switch后面不用括号

      • switch true {}

    • if后面不用括号

      • if true{}

  • 变量没有隐式转换,只能显式地去转换

    • b:= int("123")

  • 一定要有花括号

    • if a==1 {return true}

变量赋值

  • 先名称后类型

    • var b string = "1"

  • 直接隐式赋值、自动识别类型、重点不能用在全局变量

    • b:=1

uint、uint8、uint16、uint32、uint64

其他自己查

if

  • if true{}

  • if b:=1 ; n<=10{} 神奇,感觉哪里都能定义变量

switch

case自带break

如果想要贯通直接 fallthrough ,少用

循环

一个for走天下

str := "abcdefg"
for i,v := str{
    //下标
    fmt.Pringln(i)
    //值
    fmt.Pringln(v)
    
}

函数

定义值的数据类型都在后面,注意返回值的括号

func add(a string,b int) (int,string){
    return b,a
}

可变参数

在函数中的形参,上实例

main(){
    a:=getSum(1,2,3,4,5,6,7,8)
    b:=getSum(1,2,5,6,7,8)
    
}
​
func getSum(nums ...int) (int){
    sum :=0
    for i:=0 ; i< len(nums) ; i++{
        sum+=nums[i]
    }
    return sum
}

扩展说明:

  • 形参只能有一个可变参数

  • 可变参数前可以有几个不同于可变参数类型的参数

形参传递值指向

  • 数组

    • 规定个数

    • //这里指定了数组的个数
      func update(arr [4]int){
          arr[0]=100
      }
      //没有效,因为传递的只是拷贝数组,因为指定数组个数,才是拷贝数组
    • 不规定个数

    • func add(arr []int){
          arr[0]=100
      }
      //值被改了,传递的是引用类型,也就是指针

delay延迟函数

函数可以添加多个defer语句,当函数执行到最后,这些defer语句会按照逆序执行,就像栈,先进后出,看实例

func test(){
    f("1")
    f("2")
    defer f("3")
    defer f("4")
    f("5")
}
func f(s string ){
    fmt.Println(s)
}
​
//输出结果,12543

函数探索

输出一下函数名,输出了一个内存地址

使用一个函数赋值给另一个变量,然后调用新的变量,可以知道,函数也是一个变量

f1()
f2:=f1
f2()
​
func f1(){
    fmt.Println("你好")
}
  • 匿名函数

    • 我感觉我学到了javascript

    • func main(){
          f3 := func(){
              fmt.Println("你好")
          }
          f3()
      }
  • 匿名函数自己调用自己

    • 注意这里有很多元素

    • 匿名函数,形参、返回值、自己调自己

    • func main(){
          a,b := 1,2
          c := func(a,b int)(int){
              fmt.Println("你好")
          }(a,b)
      }
  • 因为这里的函数可以是一个变量,想想,是不是可以将函数变成参数进行套娃

    • func add(a,b int) int{
          return a+b
      }
      func sum(a,b int, fun func(int,int) int) int{
          r:= fun(a,b)
          return r
      }
      ​
      func main(){
          r:=sum(1,2,add)
          fmt.Println(r)
      }
    • 还可以传递一个匿名函数

    • func sum(a,b int, fun func(int,int) int) int{
          r:= fun(a,b)
          return r
      }
      ​
      func main(){
          r:=sum(1,2,func (a int,b int) int{
              if(b==0){
                  fmt.Println("除数不能为0")
                  return 0
              }
              return a/b
          })
          fmt.Println(r)
      }

闭包结构

一个函数(该函数返回一个匿名函数)里有一个匿名函数,函数返回的就是这个内部函数,而这个内部函数是操作外函数的局部变量的,在main函数中,将外函数变量赋值给一个变量,然后调用发现这个局部变量存在内存中没有另外新建额外的函数;此时外函数给另一个函数变量进一步的指向,此时是又新建一个局部函数的内存,可以说是并发,此时两个指向的函数变量都可以任意执行自己的内存,献上实例

func main() {
    r1 := increment()
​
    v := r1()
    ///这里比较正常
    fmt.Println(v)
    fmt.Println(r1())
    fmt.Println(r1())
    fmt.Println(r1())
​
    r2 := increment()
    fmt.Println(r2())
    fmt.Println(r1())
    fmt.Println(r2())
​
}
​
func increment() func() int {
    i := 0
    fun := func() int {
        i++
        return i
    }
    return fun
}
​

这里还有很多没有讲完,比如类咋搞、map咋搞,以后再更新吧,(有机会的话)

实例

1、递归

func dfs(n int) (int){
    if n==1 {
        return 1
    }
    return dfs(n-1)+n
}

这里献上一题力扣的算法题目

var p *ListNode;
func isPalindrome(head *ListNode) bool {
    p=head;    
    return dfs(head);
}
func dfs(node *ListNode) bool {
    if(node==nil){
        return true
    }
    if(!dfs(node.Next)){
        return false
    }
    if(node.Val == p.Val){
        p=p.Next
        return true
    }
    return false
}

写的很java,可以使用一下刚刚讲的匿名函数

func isPalindrome(head *ListNode) bool {
    p := head
    var rc func(*ListNode) bool
    rc = func(curnode *ListNode) bool {
        if curnode != nil {
            if !rc(curnode.Next) {
                return false
            }
            if curnode.Val != p.Val {
                return false
            }
            p = p.Next
        }
        return true
    }
    return rc(head)
}

写了之后,只能说go也是有他自己的特色的

接下来会编写一些算法为自己学习加油~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值