目录
- 概述
- 语法
- for
- 常量与变量
- 数组
- 切片 slice
- 切片问题
- 问题1
- 问题2
 
 
- Make 和 New
- 结构体和指针
- 结构体标签
 
- 结束
概述
从 java 转来学 go ,在此记录,方便以后翻阅。
语法
for
package main
import "fmt"
func main() {
	for i := 0; i < 3; i++ {
		fmt.Println(i)
	}
	fullString := "helloworld"
	for i, i2 := range fullString {
		fmt.Println(i, string(i2))
	}
}

for-range
 遍历数组,切片,字符串,Map 等
常量与变量
变量定义
- 变量 
  - var 语句用于声明一个变量列表
- 例子:var c,python
 
- 变量的初始化 
  - 变量声明可以包含初始值,每个变量对应一个
- 如果初始化值已存在,则可以省略类型;变量会从初始值中获得类型
- var i,j int =1,2
 
- 短变量声明 
  - 在函数中,简洁赋值语句:=可在类型明确的地方代替 var 声明
- 函数外的每个语句都必须以关键字开始(var,func等),因此:=结构不能在函数外使用
 
数组
- 相同类型且长度固定连续内存片段
- 以编号访问每个元素
- 定义方法 
  - var identifier [len] type
 
- 示例 
  - myArray :=[3]int{1,2,3}
 
切片 slice
和数组类似的数据结构
- 切片是对数组一个连续片段的引用
- 数组定义中不指定长度即为切片 
  - var identifier [] type
 
- 切片在未初始化之前默认为nil,长度为0
package main
import "fmt"
func main() {
	myArray := [5]int{1, 2, 3, 4, 5}
	mySlice := myArray[1:3]
	fmt.Printf("mySlice %+v\n", mySlice)
	fullSlice := myArray[:]
	fmt.Printf("fullSlice %+v\n", fullSlice)
	var mySlice2 []int
	mySlice2 = append(mySlice2, 1)
	mySlice2 = append(mySlice2, 2)
	mySlice2 = append(mySlice2, 3)
	fmt.Println(mySlice2)
}
切片问题
问题1
package main
import "fmt"
func main() {
	var a []int
	b := []int{1, 2, 3}
	c := a
	a = append(b, 1)
	fmt.Println(c)
	fmt.Println(a)
	fmt.Println(b)
}

append(b,1) 时,会重新分配地址,导致a与c并不相等。
问题2
package main
import "fmt"
func main() {
	mySlice := []int{10, 20, 30, 40, 50}
	for _, i2 := range mySlice {
		i2 *= 2
	}
	fmt.Println(mySlice)
	for i, _ := range mySlice {
		mySlice[i] *= 2
	}
	fmt.Println(mySlice)
}

注意:go 语言都是值传递
Make 和 New
- New 返回指针地址
- Make 返回第一个元素,可预设内存空间,避免未来的内存拷贝

结构体和指针
- 通过 type … struct 关键字自定义结构体
- Go 语言支持指针,但不支持指针运算 
  - 指针变量的值为内存地址
- 示贝佳的指针为 nil
 
package main
import "fmt"
type IF interface {
	// 接口里面只能定义行为
	getName() string
}
type Human struct {
	// 结构体里面只能包含属性
	firstName, lastName string
}
func main() {
	h := new(Human)
	fmt.Println(h)
	fmt.Println(&h)
	fmt.Println(*&h)
}

结构体标签
结构体中的字段除了有名字和类型外,还可以有一个可选的标签(tag)
package main
import "reflect"
type MyType struct {
	Name string `json:"name"`
}
func main() {
	mt := MyType{Name: "test"}
	mytype := reflect.TypeOf(mt)
	name := mytype.Field(0)
	tag := name.Tag.Get("json")
	print(tag)
}

结束
goLand 语法,后续会继续补充,如有疑问,欢迎评论区留言。



















