例如,当初始化一个指向int的指针时,我们使用:
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<record id="farm_menu_action" model="ir.actions.act_window">
<field name="name">Animals</field>
<field name="res_model">farmanimal.farmanimal</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="domain">[]</field>
<field name="help" type="html">
<p class="or_view_nocontent_create">Create The First Animal
</p>
</field>
</record>
<!--farm animals tree view-->
<record id="farm_tree_view" model="ir.ui.view">
<field name="name">Animal Tree</field>
<field name="model">farmanimal.farmanimal</field>
<field name="arch" type="xml">
<tree string="Animals">
<field name="name"/>
<field name="sex"/>
<field name="animal_type"/>
<field name="animal_dob"/>
</tree>
</field>
</record>
<!--farm animals kanban view-->
<record id="farm_kanban_view" model="ir.ui.view">
<field name="name">farmanimal.farmanimal.kanban</field>
<field name="model">farmanimal.farmanimal</field>
<field name="arch" type="xml">
<kanban class="o_res_farm_kanban">
<field name="id"/>
<field name="name"/>
<field name="sex"/>
<field name="animal_type"/>
<field name="animal_dob"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
<div class="o_kanban_image">
<img alt="Avatar" t-att-src="kanban_image('farmanimal.farmanimal','photo',record.id.raw_value)"/>
</div>
<div class="oe_kanban_details">
<strong class="o_kanban_record_title">
<field name="name"/>
</strong>
<div t-if="record.animal_type.value">
<t t-esc="record.animal_type.value"/>
</div>
<div t-if="record.sex.value">
<t t-esc="record.sex.value"/>
</div>
<div t-if="record.animal_dob.value">
<t t-esc="record.animal_dob.value"/>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!--farm animals form view-->
<record id="farm_free_view" model="ir.ui.view">
<field name="name">Animal Form</field>
<field name="model">farmanimal.farmanimal</field>
<field name="arch" type="xml">
<form string="Animal">
<sheet>
<field name="photo" widget="image" class="oe_left oe_avatar" />
<div class="oe_title">
<h3>
<field name="name"/>
</h3>
</div>
<group>
<group>
<field name="animal_type"/>
<field name="sex"/>
</group>
<group>
<field name="animal_dob"/>
</group>
</group>
<notebook>
<page string="Feeding Records">
</page>
<page string="Vaccination Records">
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<menuitem id="main_farm_menu" name="Farm Management" />
<menuitem id="farm_menu" name="Farm Management"
parent="main_farm_menu"/>
<menuitem id="farm_animal_menu" name="Farm Animals"
parent="farm_menu" action="farm_menu_action"/>
</data>
</odoo>
为什么不是语法呢?
var pointer *int
对我来说,第二个版本更有意义,因为它看起来像“变量'pointer'是一个int的内存地址”
或者换一种说法,我发现混淆“ *”既用于定义内存地址类型(如上),又用于取消引用,例如。 *指针= 123
这看起来是否令人困惑,还是我在这里遗漏了一些东西?
答案 0 :(得分:5)
&
是address operator,而不是类型。
对于类型为
x
的操作数T
,地址操作&x
生成类型为*T
的指针,指向x
但这是正确的*
也用作指针间接访问:
对于指针类型为
x
的操作数*T
,指针间接指向*x
表示{{ 1}}
从Tour of Go中可以看到,T
引用了类型和运算符。
这个thread from 2016提出了类似的问题。
当然,指针语法只是从C复制的。
另请参见Go's Declaration Syntax
如果我们使用了“x
”,那么Go指针将看起来像C ++引用。
并且:
*
定义了一个指针类型,然后可以在变量上有或没有&
的情况下使用。
- 使用
*int
可以访问所指向的值。- 如果没有,您将访问所指向的内存地址。
*
从变量中检索内存地址。地址不是指针,反之亦然。
您可以使用内存地址定义指针。*
&
的值为10。
var x int = 10 // declare an int variable `x` holding the value 10. var y *int = &x // Create a pointer `y` *using* the memory address of `x`.
将是*y
的内存地址
通过 Pointers in Go 在“ Dave Cheney”中查看更多信息:
Go指针与C指针一样,是指向其他值的值。这是一个非常重要的概念,不应被认为是危险的或挂在身上的。
A pointer is a value that points to the memory address of another variable。
但是:
除非您为其分配了另一个地址,否则您不能更改p指向的地址
否:y
个可能。
(另请参见“ Go at Google: Language Design in the Service of Software Engineering”)
一旦为指针分配了一个值(nil除外),Go就会保证所指向的对象在指针的生命周期内将继续有效。