Go指针 指针变量 * 和地址值 & 的区别:指针变量保存的是一个地址值,会分配独立的内存来存储一个整型数字。当变量前面有 * 标识时,才等同于 & 的用法,否则会直接输出一个整型数字。
func main() { var a int = 4 var ptr *int ptr = &a println(“a的值为”, a); // 4 println(“*ptr为”, *ptr); // 4 println(“ptr为”, ptr); // 824633794744 }
Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。
查看以下实例: 实例 package main
import “fmt”
func main() { var ptr *int
fmt.Printf(“ptr 的值为 : %xn”, ptr ) }
以上实例输出结果为:
ptr 的值为 : 0
空指针判断:
if(ptr != nil) /* ptr 不是空指针 / if(ptr == nil) / ptr 是空指针 */
定义结构体
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体有中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:
type struct_variable_type struct { member definition; member definition; … member definition; }
一旦定义了结构体类型,它就能用于变量的声明,语法格式如下:
variable_name := structure_variable_type {value1, value2…valuen} 或 variable_name := structure_variable_type { key1: value1, key2: value2…, keyn: valuen}
实例如下:
package main
import “fmt”
type Books struct { title string author string subject string book_id int }
func main() {
代码语言:javascript复制// 创建一个新的结构体
fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407})
// 也可以使用 key => value 格式
fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407})
// 忽略的字段为 0 或 空
fmt.Println(Books{title: “Go 语言”, author: “www.runoob.com”}) }
输出结果为:
{Go 语言 www.runoob.com Go 语言教程 6495407} {Go 语言 www.runoob.com Go 语言教程 6495407} {Go 语言 www.runoob.com 0}
len() 和 cap() 函数
切片是可索引的,并且可以由 len() 方法获取长度。
切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。
以下为具体实例: 实例 package main
import “fmt”
func main() { var numbers = make([]int,3,5)
printSlice(numbers) }
func printSlice(x []int){ fmt.Printf(“len=%d cap=%d slice=%vn”,len(x),cap(x),x) }
以上实例运行输出结果为:
len=3 cap=5 slice=[0 0 0]
空(nil)切片
一个切片在未初始化之前默认为 nil,长度为 0,实例如下: 实例 package main
import “fmt”
func main() { var numbers []int
printSlice(numbers)
if(numbers == nil){ fmt.Printf(“切片是空的”) } }
func printSlice(x []int){ fmt.Printf(“len=%d cap=%d slice=%vn”,len(x),cap(x),x) }
append() 和 copy() 函数
如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。
下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。 实例 package main
import “fmt”
func main() { var numbers []int printSlice(numbers)
/* 允许追加空切片 */ numbers = append(numbers, 0) printSlice(numbers)
/* 向切片添加一个元素 */ numbers = append(numbers, 1) printSlice(numbers)
/* 同时添加多个元素 */ numbers = append(numbers, 2,3,4) printSlice(numbers)
/* 创建切片 numbers1 是之前切片的两倍容量*/ numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* 拷贝 numbers 的内容到 numbers1 */ copy(numbers1,numbers) printSlice(numbers1) }
func printSlice(x []int){ fmt.Printf(“len=%d cap=%d slice=%vn”,len(x),cap(x),x) } 以上代码执行输出结果为:
len=0 cap=0 slice=[] len=1 cap=1 slice=[0] len=2 cap=2 slice=[0 1] len=5 cap=6 slice=[0 1 2 3 4] len=5 cap=12 slice=[0 1 2 3 4]
切片初始化
s :=[] int {1,2,3 }
直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
s := arr[:]
初始化切片s,是数组arr的引用
s := arr[startIndex:endIndex]
将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片
s := arr[startIndex:]