Java转Go初步学习(基础篇)

本文记录了一位从Java转向Go语言的开发者的基础学习笔记,涵盖Go的关键字、包、变量、函数、基本类型、流程控制、其他类型等核心概念。文章详细解析了Go中的make和new区别、包的导入、函数用法、类型转换和推导、切片与映射的操作,以及流程控制语句的使用,适合初学者参考。
摘要由CSDN通过智能技术生成

最近面试成功了腾讯教育子公司。以后得从事Go语言开发相关工作啦,特此在这记录下Go基础学习。
参考链接: https://tour.go-zh.org/


Go关键字

break    default      func    interface    select(选择不同类型的通讯)
case     defer        go      map(引用类型,字典)          struct
chan     else         goto    package      switch
const(常量)    fallthrough  if      range(用于读取slice、map、channel数据)        type(声明自定义类型)
continue for          import  return       var(变量)
  • 大写字母开头的变量是可导出的,也就是其它包可以读取的,是公有变量;小写字母开头的就是不可导出的,是私有变量。
  • 大写字母开头的函数也是一样,相当于class中的带public关键词的公有函数;小写字母开头的就是有private关键词的私有函数。

make & new

  • new用于各种类型的内存分配。[new分配返回的是指针,即类型*T]

new返回指针。 (它返回了一个指针,指向新分配的类型T的零值。)
new(T) 为类型T分配一片内存,初始化为0并且返回类型为*T的内存地址,适用于任意类型。对于结构体,new(T)相当于&T{}。

  • make用于内建类型(map、slice 和channel)的内存分配。[make返回引用,即T]

make返回初始化后的(非零)值。 (指向数据结构的引用在使用前必须被初始化。)
make(T) 也是用于内存分配的,但是和new不同,它只适用于3种内建的引用类型:切片、map和channel,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。

	// 为切片结构分配内存;p为指向切片的指针;*p == nil;很少使用。
	 var p *[]int = new([]int)
	// 切片v现在是对一个新的有10个整数的数组的引用。
	 var v []int = make([]int, 10)
	 
	 // 不必要地使问题复杂化:
	var p *[]int = new([]int)
	fmt.Println(p) // 输出:&[]
	*p = make([]int, 10, 10)
	fmt.Println(p)       // 输出:&[0 0 0 0 0 0 0 0 0 0]
	fmt.Println((*p)[2]) // 输出:0

	// 习惯用法:
	v := make([]int, 10)
	fmt.Println(v) // 输出:[0 0 0 0 0 0 0 0 0 0]

包、变量、和函数

包 (package main)

每个 Go 程序都是由包构成的。
程序从 main 包开始运行。

在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的。
package (在我们的例子中是package main)这一行告诉我们当前文件属于哪个包,而包名main则告诉我们它是一个可独立运行的包,它在编译后会产生可执行文件。除了main包之外,其它的包最后都会生成*.a文件(也就是包文件)并放置在 G O P A T H / p k g / GOPATH/pkg/ GOPATH/pkg/GOOS_$GOARCH中

函数

  • 函数可以返回任意数量的返回值。
  • 当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略。
  • 没有参数的 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))
}

变量 (var)

  • var 语句用于声明一个变量列表,跟函数的参数列表一样,类型在最后。
  • 如果初始化值已存在,则可以省略类型;变量会从初始值中获得类型。
  • 在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。
func main() {
   
	var i, j int = 1, 2
	k := 3
	c, python, java := true, false, "no!"
	fmt.Println(i, j, k, c, python, java)
}

基本类型

int, uint 和 uintptr 在 32 位系统上通常为 32 位宽,在 64 位系统上则为 64 位宽。 当你需要一个整数值时应使用 int 类型,除非你有特殊的理由使用固定大小或无符号的整数类型。

bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

byte // uint8 的别名

rune // int32 的别名
    // 表示一个 Unicode 码点

float32 float64

complex64 complex128

类型转换

  • 表达式 T(v) 将值 v 转换为类型 T。
i := 42
f := float64(i)
u := uint(f)

类型推导

  • 在声明一个变量而不指定其类型时(即使用不带类型的 := 语法或 var = 表达式语法),变量的类型由右值推导得出。
i := 42           // int
f := 3.142        // float64
g := 0.867 + 0.5i // complex128

常量 (const)

  • 常量可以是字符、字符串、布尔值或数值。

常量不能用 := 语法声明。

流程控制语句 for if/else switch defer

Go中流程控制分三大类:条件判断,循环控制和无条件跳转。

goto

用goto跳转到必须在当前函数内定义的标签。

func myFunc() {
   
	i := 0
Here:   //这行的第一个词,以冒号结束作为标签
	println(i)
	i++
	goto Here   //跳转到Here去
}

循环语句:for

它既可以用来循环读取数据,又可以当作while来控制逻辑,还能迭代操作。

	sum := 0
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值