【GO for java programmers】面向Java开发者的GO编程1_go for java(1)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

s.data = append(s.data, x)

}

// Pop函数是将栈顶元素移除并返回.

// 在Pop函数执行在空栈时,会被一个运行时的error警示.

func (s *Stack) Pop() interface{} {

i := len(s.data) - 1

res := s.data[i]

s.data[i] = nil  // 避免内存泄露

s.data = s.data[:i]

return res

}

// Size函数返回栈中元素的个数

func (s *Stack) Size() int {

return len(s.data)

}



[stack.go](https://bbs.csdn.net/topics/618658159)

* 顶级声明出现之前,直接的评论是文档注释。他们是纯文字。.
* 对于声明,你把名字写在类型后面.
* `struct` 对应Java中的类, 但struct组成不是方法而只能是变量.
* T`interface{}`类型对应Java的 `Object`. 在GO中它被所有的类型所实现,而不仅仅是引用类型.
* 代码段 `(s *Stack)` 声明了一个方法,接收者 `s` 对应Java中的 `this`.
* 操作符`:=`声明并初始化了一个变量. 它的类型可以从初始化表达式中推导出.


 这里是一个的Hello world程序,演示了如何使用`collection.Stack`的抽象数据类型.



package collection_test

import (

collection "."

"fmt"

)

func Example() {

var s collection.Stack

s.Push("world")

s.Push("hello, ")

for s.Size() > 0 {

    fmt.Print(s.Pop())

}

fmt.Println()

//输出: hello, world

}



[example\_test.go](https://bbs.csdn.net/topics/618658159)

###  概念上的差异


* Go的构造器没有类。Go 用 [structs](https://bbs.csdn.net/topics/618658159) 和 [interfaces](https://bbs.csdn.net/topics/618658159)来替代实例化方法,类的继承机制,动态方法查找.也可用于Java使用泛型接口
* Go提供所有类型的指针的值,而不只是对象和数组。对于任何类型 `T`,有一个相应的指针类型`*T`表示[指针](https://bbs.csdn.net/topics/618658159)指向类型 `T`的值。
* Go允许任何类型都有方法而没有装箱的限制 方法*receiver*,在Java中对应`this`可以是直接值或者是指针.
* 数组在Go就是值. 当一个数组被当做函数的参数时,这个函数接收到的是数组的拷贝而不是它的指针. 然而在实践中,函数经常使用 [slices](https://bbs.csdn.net/topics/618658159)作为参数; slices引用了基础数组.
* 该语言提供了字符串,一个字符串行为就像一个字节片,但是是不可改变的。
* 该语言中的哈希表被称作maps.
* 该语言提供了独立运行的线程[goroutines](https://bbs.csdn.net/topics/618658159) 和他们之间的通信渠道[channels](https://bbs.csdn.net/topics/618658159).
* 某些类型(maps, slices, 和 channels)是按引用传递,而不是值。也就是说,传递一个map到函数并而不是拷贝map,如果函数修改了map,将被调用者看到变化。在Java术语来说,可以认为这是一个map的引用.
* Go提供了两种访问级别对应Java的public和包的private.如果它的命名是大写字母开头就是最高级别public,反之就是包的private.
* 作为替换Java中的异常机制, Go采用了类型 [error](https://bbs.csdn.net/topics/618658159)值来表示事件,如文件结尾,和运行时的[panics](https://bbs.csdn.net/topics/618658159)来表示运行时的错误,如数组越界等.
* Go不支持隐式类型转换。混合使用不同类型的操作需要显式转换.
* Go不支持函数重载。在同一范围内的函数和方法必须具有唯一的名称.
* Go使用`nil`表示无效的指针,类似于Java使用`null`.


###  句法


####  声明


 声明是跟Java是相反的。你在类型后面再写名称,类型声明从左往右更容易读




|  Go |  与Java相对应的 |
| --- | --- |
| `var v1 int` | `int v1;` |
| `var v2 *int` | `Integer v2;` |
| `var v3 string` | `String v3 = "";` |
| `var v4 [10]int` | `int[] v4 = new int[10]; // v4 在Go中是一个值.` |
| `var v5 []int` | `int[] v5;` |
| `var v6 *struct { a int }` | `C v6; // Given: class C { int a; }` |
| `var v7 map[string]int` | `HashMap<String,Integer> v7;` |
| `var v8 func(a int) int` | `F v8; // Given: interface F { int f(int a); }` |


 声明的一般形式是一个关键字后面跟着被声明对象的名字.这个关键字是`const`, `type`,`var`, 或者`func`. 您也可以使用一个关键字,后面的括号中跟着一系列声明.



var (

n int

x float64

)


 当声明一个函数,你必须提供每个参数的名称,或者不提供任何参数的名称,你不能提供了一些而忽略了另外一些名字。 您可以组合几个相同类型的名称:



func f(i, j, k int, s, t string)


 一个变量可以在声明时初始化。当这样做时,指定的变量的类型是允许的,但不是必需的。当未指定类型,默认的是初始化表达式的类型.



var v9 = *v2


 如果一个变量没有立即初始化,必须要制定类型。那样的情况下,它它会被隐式初始化该类型的零值*zero value*(`0`, `nil`, `""`, 等.).  Go不存在未初始化的变量.


####  短声明


 在函数中,一个短的声明句法是 `:=` 表示.



v10 := v1


 这等效于



var v10 = v1


####  函数类型


 在Go中,函数都是一等公民。Go的函数类型表示一组所有具有相同的参数和返回类型的函数.



type binOp func(int, int) int

var op binOp

add := func(i, j int) int { return i + j }

op = add

n = op(100, 200) // n = 100 + 200


####  多重分配


 GO允许多重分配。在右边的表达式会在评估后,再分配到任何的左操作数。





![img](https://img-blog.csdnimg.cn/img_convert/bbd538472a481b82f58d550888e2f999.png)
![img](https://img-blog.csdnimg.cn/img_convert/c8c2b9bbd9ca168386ada9cb74b8000b.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

6170)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值